Java 列表<;字符串[]>;循环问题

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

我在尝试向字符串的2D矩阵添加额外列时遇到了复制问题

这是我的密码:

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等。除非有很好的理由使用它们,否则应该避免使用数组。非常感谢!已经修好了。我花了一个小时盯着那个代码。非常感谢!已经修好了。我花了一个小时盯着代码看。是的,这就是问题所在!谢谢。是的,这就是问题所在!非常感谢。