Java - 列表中的所有元素变得相同

时间:2015-10-27 16:01:23

标签: java list for-loop arraylist

我在使用for循环将元素分配给List时遇到问题。这是我遇到问题的代码部分:

private static List<String[]> modify(List<String[]> data) {
    List<String[]> data2 = new ArrayList<>();
    for (int i=0; i<data.size(); i++) {
        String[] block = data.get(i);
        // some code here to modify the contents of block
        data2.add(block);
    }
    return data2;
}

由于某种原因,此方法返回一个List,其所有元素完全相同。我已经尝试输出List元素以查看这种情况发生的地方,并且它似乎发生在循环之外。例如,这个:

private static List<String[]> modify(List<String[]> data) {
    List<String[]> data2 = new ArrayList<>();
    for (int i=0; i<data.size(); i++) {
        String[] block = data.get(i);
        // some code here to modify the contents of block
        data2.add(block);
        System.out.println(Arrays.toString(data2.get(i));
    }
    return data2;
}

显示不同元素的列表,而这个:

private static List<String[]> modify(List<String[]> data) {
    List<String[]> data2 = new ArrayList<>();
    for (int i=0; i<data.size(); i++) {
        String[] block = data.get(i);
        // some code here to modify the contents of block
        data2.add(block);
    }
    for (int i=0; i<data2.size(); i++) {
        System.out.println(Arrays.toString(data2.get(i)));
    return data2;
}

显示仅包含相同元素的列表。在我看来,元素正在被正确地添加到for循环内的List中,但最终变得相同。为什么会这样,我该如何解决?

2 个答案:

答案 0 :(得分:1)

您应该创建一个临时字符串来进行操作,初始化String数组,然后用数据填充它,然后将其传递给data2,如下所示:

private static List<String[]> modify(List<String> data) {
    List<String[]> data2 = new ArrayList<>();
    for (int i=0; i<data.size(); i++) {
        String tempString = data.get(i);
        String[] block = new String[255];
        // some code here to modify the contents of block
        // actually fill block with data
        block.add("modified data");
        block.add("more manipulated data");
        data2.add(block);
    }
    return data2;
}

修改 这应该可以解决无编译问题!

答案 1 :(得分:0)

你设法使这个代码运行似乎很奇怪。您的代码中存在明显的语法错误:

private static List<String[]> modify(List<String> data) {
...
  String[] block = data.get(i);

您的block是一个String数组,而data.get()返回一个字符串。在你的片段后面,大括号是无法匹配的,所以它也不应该被编译。如果你把&#39;}&#39;在System.out.println(...);之后创建List<String>[]类型的参数而不是List<String>,您的代码可以正常运行。