【问题标题】:Java replacing character in string from the backJava从后面替换字符串中的字符
【发布时间】:2017-03-10 06:23:12
【问题描述】:

我在尝试用字符串中的 ASCII 字符替换某些字符时遇到了一些问题。

假设我得到了这个字符串“CCCCCCC”。执行某种方法后,它会变成“CCCCCCa”。然后第二次我将检查倒数第二个字符并执行一些方法来获得“CCCCCca”。然后第三次将检查倒数第三个字符,依此类推,重复 7 次。

for (int i = 0; i < 256; i++){          
        plaintext = plaintext .substring(0,plaintext .length() - counter) + Character.toString((char)i);
}

我使用 for 循环遍历所有 256 个 ASCII 字符。在我执行一些解密后,计数器将增加。所以基本上第一次是-1(最后一个字符),然后第二次是-2(最后一个字符),以此类推。

让我这么说吧,我第一次希望将所有 256 个 ASCII 附加到我的 7 字节字符串的末尾。然后在我执行一些解密之后,字符串将变为 CCCCCCCa。因此,当我第二次循环时,我会将字符串中的倒数第二个字符替换为所有 256 ASCII。并且经过一些解密后,字符串会变成CCCCCC(a。然后我循环,直到字符串中没有C。

但是,我收到 String index out of range: -1 错误消息。是否有任何其他方法可以在每个 for 循环之后替换大小减小 1 的字符串的最后一个字符?

提前致谢。

【问题讨论】:

  • counter 的值是多少?
  • 首先,您忘记添加字符串的右侧部分(在您更改的字符之后),因此每次循环都会丢失一个字符(第一个除外)。当然,如果您在该循环中的某处增加counter,您最终将尝试substring(0,-1) 您需要迭代plaintext.length() 次,而不是256 次。PS:我不会使用低于20 的Character,因为这些是特殊的代码)
  • 计数器被初始化为1。然后在我在下部执行一些解密后,我将增加它。我试图做的是替换字符串的最后一个字符不是大写的
  • 另外,我认为您应该考虑将StringBuilder 用于此类目的。 (或者StringBuffer,如果你想要线程安全)
  • 我发现它可以替换特定位置的字符: public static String replaceCharAt(String s, int pos, char c) { return s.substring(0,pos) + c + s.子串(pos+1); }

标签: java string for-loop


【解决方案1】:

首先,不要忘记其余的。

    plaintext = plaintext.substring(0,plaintext .length() - counter) 
                     + Character.toString((char)i)
                     + plaintext.substring(plaintext .length() - counter + 1) ; //TO add the rest

然后,您需要检查计数器是否不大于plaintext.length()

for (int i = 0; i < 256 && counter <= plaintext.length(); i++){

我建议使用String.toCharArray() 并从头开始迭代,这样会容易得多。

char[] array = plaintext.toCharArray();
for(int i = array.length - 1, char c = 0; i >= 0; --i){
    array[i] = c++;
}

两个代码示例:(使用 'a' 作为第一个字符而不是 0)

public static void main(String[] args) {
    String plaintext = "CCCCCC";
    for (int i = 'a', counter = 1; i < 256 && counter <= plaintext.length(); i++, ++counter) {
        plaintext = plaintext.substring(0, plaintext.length() - counter)
                + Character.toString((char) i)
                + plaintext.substring(plaintext.length() - counter + 1);
    }

    System.out.println(plaintext);
    plaintext = "CCCCCC"; //fedcba
    char[] array = plaintext.toCharArray();
    char c = 'a';
    for (int i = array.length - 1; i >= 0; --i) {
        array[i] = c++;
    }
    System.out.println(new String(array)); //fedcba
}

fedcba

fedcba

【讨论】:

  • 按照您的建议实施,ASCII 的循环在 65 处停止,然后继续替换倒数第二个,依此类推。
  • @DeniseTan 哪一个?我在这里提供解决方案;)而且我没有测试那些是诚实的,可能做了错字
  • @DeniseTan 就像我一样,第一个 for 循环有错字,它是 counter &lt;= plaintext.length()
  • 我也在尝试调试:(可能与我的代码的其他部分发生冲突。因为到目前为止,从后到前的每个位置都循环了 65 次。然后一旦一切就绪完成,它会抛出我 IndexOutOfBoundException
  • @DeniseTan 如果您不发布minimal reproducible example,将无法提供帮助。我只是发布我的例子
猜你喜欢
  • 2023-03-25
  • 2021-07-03
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 2013-07-09
  • 2021-01-27
  • 2012-06-27
  • 2015-05-01
相关资源
最近更新 更多