Java 对于每个数组操作
我试图通过将每个字符偏移一些值来操作一个字符数组 通过使用IDE的调试功能,我发现在循环中一切都很好。在循环外,数组似乎保持不变,至少我认为这是因为更改仅在for each循环的范围内有效 我如何以一种干净、专业的方式使这些变化永久化 我的代码: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
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循环就更清晰了。