Java 列表<;字符串[]>;循环问题
我在尝试向字符串的2D矩阵添加额外列时遇到了复制问题 这是我的密码:Java 列表<;字符串[]>;循环问题,java,for-loop,duplicates,Java,For Loop,Duplicates,我在尝试向字符串的2D矩阵添加额外列时遇到了复制问题 这是我的密码: List<String[]> rowValues; // the matrix, #of rows not // important, #of columns is 7] String[] columnValues = new String[8]; // w
List<String[]> rowValues; // the matrix, #of rows not
// important, #of columns is 7]
String[] columnValues = new String[8]; // would contain the old row
// data plus one extra String
// LOOP ON ROWS
for(int i = 0; i < rowValues.size(); i++) {
// LOOP ON COLUMNS
for (int j = 0; j < rowValues.get(i).length; j++) {
columnValues[j] = rowValues.get(i)[j];
}
columnValues[7] = "ENTRY" + i;
rowValues.set(i, columnValues);
System.out.println(rowValues.get(i)[0]); // last element in each iteration
}
// END LOOPS
System.out.println(rowValues.get(0)[0]); // element in 0-0 is
// the same as last row-0
会是,
[to, figure, out, ENTRY2]
[to, figure, out, ENTRY2]
[to, figure, out, ENTRY2]
覆盖
columnValues
变量的值
您应该在循环中声明它
List<String[]> rowValues; // the matrix, #of rows not
// important, #of columns is 7
//////////////////
// LOOP ON ROWS //
//////////////////
for(int i = 0; i < rowValues.size(); i++) {
final String[] columnValues = new String[8]; // would contain the old row
// data plus one extra String
/////////////////////
// LOOP ON COLUMNS //
/////////////////////
for (int j = 0; j < rowValues.get(i).length; j++) {
columnValues[j] = rowValues.get(i)[j];
}
columnValues[7] = "ENTRY" + i;
rowValues.set(i, columnValues);
System.out.println(rowValues.get(i)[0]); // last element in each iteration
}
///////////////
// END LOOPS //
///////////////
System.out.println(rowValues.get(0)[0]); // element in 0-0 is
列出行值;//矩阵,行的#不是
//重要提示,#列数为7
//////////////////
//按行循环//
//////////////////
对于(int i=0;i
覆盖columnValues
变量的值
您应该在循环中声明它
List<String[]> rowValues; // the matrix, #of rows not
// important, #of columns is 7
//////////////////
// LOOP ON ROWS //
//////////////////
for(int i = 0; i < rowValues.size(); i++) {
final String[] columnValues = new String[8]; // would contain the old row
// data plus one extra String
/////////////////////
// LOOP ON COLUMNS //
/////////////////////
for (int j = 0; j < rowValues.get(i).length; j++) {
columnValues[j] = rowValues.get(i)[j];
}
columnValues[7] = "ENTRY" + i;
rowValues.set(i, columnValues);
System.out.println(rowValues.get(i)[0]); // last element in each iteration
}
///////////////
// END LOOPS //
///////////////
System.out.println(rowValues.get(0)[0]); // element in 0-0 is
列出行值;//矩阵,行的#不是
//重要提示,#列数为7
//////////////////
//按行循环//
//////////////////
对于(int i=0;i
您从未更改列值
以指向新的字符串[]
,因此实际上行值
包含对同一对象的多个引用
尝试将
columnValues
的定义移动到for
循环的外部中,以便为每次迭代创建一个新的String[]
。您从不更改columnValues
以指向一个新的String[]
,因此实际上rowValues
包含对同一对象的多个引用
尝试将列值的定义移动到for
循环的外部中,以便为每次迭代创建一个新的字符串[]
。此处保存数据的是字符串[]
的实例
您只能在此处创建一个这样的实例:
String[] columnValues = new String[8];
因此,您将所有值写入同一位置,并且您将看到3倍相同的数组,因为您刚刚将3倍相同的数组添加到列表中
在内部循环的每次循环中,您都会用新数据覆盖这个columnValues
数组的内容,这会影响您已经在列表中放置的内容,因为列表只是多次指向您反复修改的单个数组
要解决问题,请将创建数组的行放入外部循环中,以便为每行分配新数组。此处保存数据的是String[]
的实例
您只能在此处创建一个这样的实例:
String[] columnValues = new String[8];
因此,您将所有值写入同一位置,并且您将看到3倍相同的数组,因为您刚刚将3倍相同的数组添加到列表中
在内部循环的每次循环中,您都会用新数据覆盖这个columnValues
数组的内容,这会影响您已经在列表中放置的内容,因为列表只是多次指向您反复修改的单个数组
要解决您的问题,请将创建数组的行放在外部循环中,以便为每行分配一个新数组。不要将二维数组表示为List
。使用List
。或者简单地使用Foo[][
数组列表不是一个好方法。你能添加所需的结果吗?@ChristofferPass我不是说大小灵活。我的意思是,如果您使用List
,您可以轻松地交换实现:LinkedList、ArrayList、CopyOnWriteArrayList等。除非有很好的理由使用数组,否则应避免使用数组。不要将2D数组表示为List
。使用List
。或者简单地使用Foo[][
数组列表不是一个好方法。你能添加所需的结果吗?@ChristofferPass我不是说大小灵活。我的意思是如果你使用List
你可以很容易地替换掉实现:LinkedList、ArrayList、CopyOnWriteArrayList等。除非有很好的理由使用它们,否则应该避免使用数组。非常感谢!已经修好了。我花了一个小时盯着那个代码。非常感谢!已经修好了。我花了一个小时盯着代码看。是的,这就是问题所在!谢谢。是的,这就是问题所在!非常感谢。