【问题标题】:Is there a way to change the caracters of a String one by one by caracters in a tab?有没有办法在选项卡中逐个字符地更改字符串的字符?
【发布时间】:2019-12-16 14:14:28
【问题描述】:

我的主要目的是将标签中存储的字符存储到具有相同长度的String

所以我尝试使用for 循环和方法replace(oldChar, newChar) 将我在开头声明的String 的每个字符替换为选项卡中相同位置的字符。

public static void main(String[] args) {
  String card = "xxxx";
  char[] code = {'0', '1', '2', '3',};

  for (int i = 0; i < code.length-1; i++) {
    card.replace(card.charAt(i), code[i]);
  }
  System.out.println(card);
}

我期待0123的输出,但是当我运行代码时,它显示了原始字符串值(xxxx),好像for循环没用一样。

【问题讨论】:

  • docs.oracle.com/javase/7/docs/api/java/lang/… 返回一个新字符串。旧字符串未更改。
  • 如果您想做这样的事情(正如您所提到的),您可能希望将card 的类型更改为char[]...如果需要,在之后返回String操纵。
  • @hesseux 正如@Andreas 指出的那样,replace 替换了所有内容,因此此代码将永远无法工作。我想指出,如果您使用replace,因为您看到了replaceAll,它们替换所有出现,只是使用不同的方式。感到困惑是很常见的事情。

标签: java eclipse for-loop replace


【解决方案1】:

你为什么要code.length - 1?我的意思是code.length 实际上是您需要的长度在此字符串中从 1 开始:"a",在此字符串中最多更改为 2:"ab"

所以实际上code 的长度不是从单个字母的 0 开始,而是从单个字母的 1 开始。长度实际上是 code.length NOT code.length - 1

另外,正如其他人指出的那样,字符串在 Java 中是不可变的。这意味着您无法更改它们。当您执行String.replace() 时,它会返回一个新字符串而不是更改的旧字符串。

所以这是for循环中的正确代码:

for(int i = 0; i < code.length; i++){
  card = card.replace(card.charAt(i), code[i]);
}

所以在这种情况下,我更改了card,因为我没有单独使用replace 函数,我实际上将card 更改为它的替换。

首先,我所做的是将card 更改为card.replace(card.charAt(i), code[i])。所以我还是保留了原来的字符串,只是改了,没有新建字符串。

【讨论】:

    【解决方案2】:

    恕我直言,一种更简单的方法是使用 String 类提供的方法在一个语句中完成。

    给出以下内容:

          String card = "xxxx";
          char[] code = { '0', '1', '2', '3',
          };
    

    你可以这样做。

          card = String.valueOf(code) + card.substring(code.length);
          System.out.println(card);  // prints 0123
    

    它的工作方式是。

    1. String.valueOf(code) 将 char 数组转换为字符串。
    2. card.substring(code.length) 在这种情况下获取从 4 开始的其余字符串。
    3. 然后将它们连接在一起。

    如果你有一个字符串而不是一个字符数组,你可以直接使用它。

    如果字符串比代码数组长,此方法也会保留卡片中多余的字符。

    【讨论】:

    • @zixuan 所以?我没有更改字符串,我创建了一个新字符串。显然你没有检查我的代码,因为它有效。
    • @zixuan 因此,如果您认为保留字符串更好,那么 1)您为什么不在其他答案中提出这个问题,以及 2)您为什么不自己保留字符串?
    【解决方案3】:

    要将char[] 转换为String,请调用String​(char[] value) 构造函数:

    char[] code = {'0', '1', '2', '3'};
    String card = new String(code);
    System.out.println(card); // prints: 0123
    

    即使您解决了捕获调用replace 的结果的问题(如其他答案中所述),您的代码也永远不会工作,因为在第一次迭代时card.charAt(i) 返回'x',所以replace(card.charAt(i), code[i]) 意味着@ 987654331@,替换所有 X,得到card = "0000"
    第二次迭代:card = "1111"
    第三次迭代:card = "2222"
    第四次迭代:card = "3333"

    如果你想构建一个字符串,使用StringBuilder:

    char[] code = {'0', '1', '2', '3'};
    StringBuilder buf = new StringBuilder("xxxx");
    for (int i = 0; i < code.length; i++) 
        buf.setCharAt​(i, code[i]);
    String card = buf.toString();
    System.out.println(card); // prints: 0123
    

    或者:

    StringBuilder buf = new StringBuilder();
    for (int i = 0; i < code.length; i++) 
        buf.append(code[i]);
    

    【讨论】:

      【解决方案4】:

      在 Java 中,字符串是不可变的,这意味着您无法更改它们。当您调用String.replace() 时,它实际上会返回一个新字符串,而不是修改您的旧字符串。如果您想要一个字符串,其内容与数组中的内容类似,请使用字符串构造函数card = new String(code)。然后字符串将包含数据0123

      【讨论】:

        【解决方案5】:

        我希望输出 0123,但是当我运行代码时,它显示 原来的字符串是xxxx,好像for循环没用一样

        在 Java 中,String 对象是不可变的。 replace 方法返回一个新的 String 对象,该对象具有您所需的修改。

        card = card.replace(card.charAt(i), code[i]);

        附:此外,您的 for 循环没有覆盖数组的最后一个元素。为i &lt; code.length 运行它。

        【讨论】:

        • 检查我的答案。字符串不是对象,它们是数组。正确的?哦,对了,你忘了在“In Java”后面加逗号,所以我误解了你的意思。
        猜你喜欢
        • 1970-01-01
        • 2023-04-01
        • 2019-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多