首页 > 解决方案 > 如何在循环中覆盖字符串

问题描述

public static String decrypt(final String encryptedText, final int n) {


    char [] chars;
    String s = encryptedText;
    String s1 = "";
    int buffer = 0;
    int buffer2 = 1;

    for (int j = 0; j < n; j++) {
        if (j < 1){
            chars = s.toCharArray();
        }else{
            chars = s1.toCharArray();
        }
        char [] charsUpdate = new char[chars.length];

        for (int i = chars.length / 2; i < chars.length; i++) {
            if (buffer % 2 == 0 && buffer <= charsUpdate.length){
                charsUpdate[buffer] = chars[i];
            }
            buffer += 2;
        }
        for (int i = 0; i < chars.length / 2 ; i++) {
            if (buffer2 % 2 != 0 && buffer2 < charsUpdate.length){
                charsUpdate[buffer2] = chars[i];
            }
            buffer2 += 2;
        }
        s = "";
        s1 = "";
        for (int i = 0; i < charsUpdate.length; i++) {
            s = s + charsUpdate[i];
        }
        s1 = s;
    }
    return s;

你好,社区。我这里有一些问题。我尝试解决一些任务,并且在我需要在循环中覆盖我的字符串时陷入困境。我需要在循环开始时给出我的旧字符串并在循环结束时覆盖这个字符串并在循环开始时给出新字符串,类似那样,但我不能这样做,因为在循环开始的第一次迭代之后我可以看看我的空字符串。对不起我的狗屎代码和糟糕的英语:)

标签: javastring

解决方案


还有一些其他问题:

  1. ArrayIndexOutOfBoundsException因为条件buffer <= charsUpdate.length不正确
  2. 变量bufferbuffer2在循环结束时不会重置,因此在charUpdate第二次和下一次迭代期间重新创建数组后,符号不会从复制charscharUpdate

更新和重构的代码可能如下所示:

    public static String decrypt(final String encryptedText, final int n) {
        int len = encryptedText.length();
        int half = len / 2;
        String s = encryptedText;

        for (int j = 0; j < n; j++) {
            char[] chars = s.toCharArray();

            char[] charsUpdate = new char[len];

            for (int i = half, even = 0; i < len && even < len; i++, even += 2) {
                charsUpdate[even] = chars[i];
            }
            for (int i = 0, odd = 1; i < half && odd < len; i++, odd += 2) {
                charsUpdate[odd] = chars[i];
            }
            s = new String(charsUpdate);
        }
        return s;
    }

但我不确定它是否会产生有效的结果。

一个简单的测试显示以下输出:

for (int i = 1; i < 5; i++) {
    System.out.println("abcdefgh (" + i + ") -> " + decrypt("abcdefgh", i));
}

输出:

abcdefgh (1) -> eafbgchd
abcdefgh (2) -> gecahfdb
abcdefgh (3) -> hgfedcba
abcdefgh (4) -> dhcgbfae
----
// for odd length of the input string
abcdefg (1) -> daebfcg
abcdefg (2) -> bdfaceg
abcdefg (3) -> abcdefg
abcdefg (4) -> daebfcg

推荐阅读