列出<string []>循环问题

时间:2017-08-01 09:46:21

标签: java for-loop duplicates

在尝试将额外的列添加到字符串的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

我的问题是所有行都包含最后一行的数据,加上标记为的额外列: &#34; ENTRYX&#34;

例如,

[hi,    im,      haithem]
[this,  is,      hard]
[to,    figure,  out]

会是,

[to,   figure,  out,  ENTRY2]
[to,   figure,  out,  ENTRY2]
[to,   figure,  out,  ENTRY2]

3 个答案:

答案 0 :(得分:0)

您覆盖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 

答案 1 :(得分:0)

您永远不会将columnValues更改为指向新的String[],因此实际上rowValues包含对同一对象的多个引用。

尝试在外部columnValues循环内移动for的定义,以便为每次迭代创建一个新的String[]

答案 2 :(得分:0)

这里的数据包含String[]

的实例

您只能在此处创建一个此类实例:

String[] columnValues = new String[8];

因此,您将所有值都写在同一个地方,并且您看到相同数组的3倍,因为您只是将相同数组的3倍添加到列表中。

在内循环的每个转弯处,您使用新数据覆盖此单个columnValues数组的内容,这会影响您已放入列表中的内容,因为该列表只是多次指向该单个数组你一遍又一遍地修改。

要解决您的问题,请将创建数组的行放在外部循环中,以便为每行分配一个新数组。