是的,我知道Java的字符串是不可改变的,但是,仅凭这一点并不能解释为什么这对我不起作用...
当我尝试将字符串数组(String[]
)转换为格式为('String[0]','String[1]',...,'String[n]')
的字符串时,我遇到了这个问题。
例如,给定以下数组:
String[] array=new String[3];
array[0]="Jake";
array[1]="Mishel";
array[2]="Dan";
我想创建字符串:('Jake','Mishel','Dan')
但是,这样做的方式不是这篇文章的目的......
我有兴趣知道的是,为什么这样做:
String[] array=new String[3];
array[0]="Jake";
array[1]="Mishel";
array[2]="Dan";
for (int i=0; i<array.length; i++) {
array[i]=array[i]+"'";
array[i]="'"+array[i];
}
String str=Arrays.toString(array);
str=str.replace('[','(');
str=str.replace(']',')');
System.out.println(str); //produces ('Jake','Mishel','Dan'), as desired
但这不是:
String[] array=new String[3];
array[0]="Jake";
array[1]="Mishel";
array[2]="Dan";
for (String str: array) {
str=str+"'";
str="'"+str;
}
String str=Arrays.toString(array);
str=str.replace('[','(');
str=str.replace(']',')');
System.out.println(str); //produces wrong output: (Jake,Mishel,Dan)
答案 0 :(得分:4)
它不起作用,因为在第二个中,您将数组中每个索引的字符串值提取为str
,然后更改str
,而不是字符串在数组中(技术上没有变化,替换将是一个更好的词)。在第一个中,您使用新值重写数组的索引。
实际上,在for循环中,您正在使用与全局变量具有相同值的局部变量。但是,这是一个新变量,因此它没有在循环之外的范围。在常规for循环中,您显式更新位于数组的每个索引处的项目。
答案 1 :(得分:3)
此代码
for (String str: array) {
str = str+"'";
str = "'"+str;
}
相当于
for (int i=0; i<array.length; i++) {
//Temporary local variable named str which holds value from array
String str = array[i];
str = str+"'";
str = "'"+str;
}
所以通过str=str+"'";
重新分配不影响数组的局部变量,而array[i]=array[i]+"'";
实际更新数组中的值。
BTW:Java 8添加了StringJoiner
类,可以像
StringJoiner sj = new StringJoiner("','", "'", "'");//delimite, prefix, suffix
for (String str : array)
sj.add(str);
System.out.println(sj);
生成'Jake','Mishel','Dan'
我们还可以使用添加到join
的{{1}}方法创建单行解决方案
String
答案 2 :(得分:1)
for (String str: array) { // read as for each string str in Array array. str contains same value as arr[i]
str=str+"'";
str="'"+str;
}
你的问题。您正在处理数组实际字符串的副本。你不在数组上工作。
答案 3 :(得分:1)
在你的循环中str
实际上是一个局部变量;它不是对数组元素的引用,而是一个新的String,它是该元素的副本。因此,对str
的更改不会更改数组的元素。
答案 4 :(得分:1)
这个原因
for (String str: array) {
str=str+"'";
str="'"+str;
}
不起作用是因为您正在修改引用String str
(它与作为本地副本的数组无关)。
首先,您可以使用
声明并初始化数组String[] array = { "Jake", "Mishel", "Dan" };
然后
for (int i = 0; i < array.length; i++) {
array[i] = array[i] + "'";
array[i] = "'" + array[i];
}
应该是
for (int i = 0; i < array.length; i++) {
array[i] = "'" + array[i] + "'";
}
最后,你可以写
str=str.replace('[','(');
str=str.replace(']',')');
作为
str = str.replace('[', '(').replace(']', ')');
把它放在一起
String[] array = { "Jake", "Mishel", "Dan" };
for (int i = 0; i < array.length; i++) {
array[i] = "'" + array[i] + "'";
}
String str = Arrays.toString(array);
str = str.replace('[', '(').replace(']', ')');
System.out.println(str);
输出
('Jake', 'Mishel', 'Dan')
答案 5 :(得分:0)
它不起作用,因为str
不数组中的String
,它是一个局部变量,具有与&#34;真实&#相同的特征34;数组中的String
/数组中String
的副本。