Java 对于每个数组操作

Java 对于每个数组操作,java,arrays,foreach,iteration,Java,Arrays,Foreach,Iteration,我试图通过将每个字符偏移一些值来操作一个字符数组 通过使用IDE的调试功能,我发现在循环中一切都很好。在循环外,数组似乎保持不变,至少我认为这是因为更改仅在for each循环的范围内有效 我如何以一种干净、专业的方式使这些变化永久化 我的代码: public class OffsetTest { public static void main(String[] args) { String someString = "Cuckoo"; String ou

我试图通过将每个字符偏移一些值来操作一个字符数组

通过使用IDE的调试功能,我发现在循环中一切都很好。在循环外,数组似乎保持不变,至少我认为这是因为更改仅在for each循环的范围内有效

我如何以一种干净、专业的方式使这些变化永久化

我的代码:

public class OffsetTest {
    public static void main(String[] args) {
        String someString = "Cuckoo";
        String output = stringOffset(someString);
        System.out.println(output);
    }

    public static String stringOffset(String s) {
        char[] ca = s.toCharArray();
        for(char c : ca) {
            c += 3;
        }
        return String.valueOf(ca);
    }
}
如何执行此操作?

当调用s.tocharray时,字符串将转换为char[]数组。类型char在Java中是一个基本类型,因此循环中的变量c有一个值的副本。如果更改c变量,则不是在修改原始数组

如果需要修改字符串,则需要使用结果生成另一个字符串,不能修改原始字符串。

调用s.tocharray时,字符串将转换为char[]数组。类型char在Java中是一个基本类型,因此循环中的变量c有一个值的副本。如果更改c变量,则不是在修改原始数组


如果需要修改字符串,则需要使用结果构建另一个字符串,不能修改原始字符串。

将值复制到一个单独的变量并递增,从而使数组保持不变

而是使用索引变量在数组上迭代。这允许您再次设置该值:

for (int i = 0 ; i < ca.length ; i++) {
    ca[i] += 3;
}

您将值复制到一个单独的变量中,并使其递增,从而使数组保持不变

而是使用索引变量在数组上迭代。这允许您再次设置该值:

for (int i = 0 ; i < ca.length ; i++) {
    ca[i] += 3;
}

您正在处理函数中循环内字符串的副本,如果确实需要,可以执行以下操作:

public class classname{
    public static void main(String[] args) {
        String someString = "Cuckoo";
        String output = stringOffset(someString);
        System.out.println(output);
    }

    public static String stringOffset(String s) {
        char[] ca = s.toCharArray();
       char cb[] = new char[s.length()];//array to store new characters after offsetting
       int i=0;
        for(char c : ca) {
            c += 3;
            cb[i]=c;
            i++;
        }
        return String.valueOf(cb);
    }
}

您正在处理函数中循环内字符串的副本,如果确实需要,可以执行以下操作:

public class classname{
    public static void main(String[] args) {
        String someString = "Cuckoo";
        String output = stringOffset(someString);
        System.out.println(output);
    }

    public static String stringOffset(String s) {
        char[] ca = s.toCharArray();
       char cb[] = new char[s.length()];//array to store new characters after offsetting
       int i=0;
        for(char c : ca) {
            c += 3;
            cb[i]=c;
            i++;
        }
        return String.valueOf(cb);
    }
}

下面介绍如何在不使用for循环的情况下执行此操作:

public static String stringOffset(String s) {
    return s.codePoints()
            .map(c -> c + 3)
            .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
            .toString();

}
或者,一种更有效的方法可以避免重新分配:

public static String stringOffset(String s) {
    return s.chars()
            .collect(() -> new StringBuilder(s.length()),
                    (sb, c) -> sb.append((char) (c + 3)),
                    StringBuilder::append)
            .toString();

}

下面介绍如何在不使用for循环的情况下执行此操作:

public static String stringOffset(String s) {
    return s.codePoints()
            .map(c -> c + 3)
            .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
            .toString();

}
或者,一种更有效的方法可以避免重新分配:

public static String stringOffset(String s) {
    return s.chars()
            .collect(() -> new StringBuilder(s.length()),
                    (sb, c) -> sb.append((char) (c + 3)),
                    StringBuilder::append)
            .toString();

}

c只是c[i]的一个副本而不是引用c只是c[i]的一个副本而不是引用所以不能用for-each循环来实现这一点吗?不。在这种情况下,您缺少设置要迭代的数组值的方法。@dchlebicki实际上,Lalit给出了答案,它使用了一个for-each和一个外部索引变量,但它本质上与我的答案相同。所以没有办法用for-each循环实现这一点吗?没有。在这种情况下,您缺少设置迭代数组值的方法。@dchlebicki实际上,Lalit给出了答案,它使用for-each和外部索引变量,但这与我的答案基本相同,即使元素是引用类型,r=doSomethingWith;不会替换数组中的值。即使元素是引用类型,r=doSomethingWithr;不会替换数组中的值。不需要创建第二个数组。@KlitosKyriacou这只是执行此操作的方法之一。这真的很尴尬。只使用基本的for循环会更清晰。不需要创建第二个数组。@KlitosKyriacou这只是实现此目的的方法之一。这真的很尴尬。仅仅使用一个基本的for循环就更清晰了。