Java ArrayList.removeAll()

时间:2018-12-30 23:53:47

标签: java for-loop arraylist

我想编写一段包含列表列表的代码,将其分成9个子列表,并从每个子列表中的所有列表中删除数字。但是,当我的代码运行时,它会从所有列表中删除数字,而不仅仅是从原始列表中提取的部分

for (int startingIndex = 0; startingIndex <= 8; startingIndex++) {
        int initialIndex = startingIndex * 9;
        ArrayList<ArrayList<String>> gridRow = new ArrayList<ArrayList<String>>();
        gridRow.addAll((posabilityGrid.subList(initialIndex, initialIndex+9)));
        System.out.println("gridrow - " + gridRow);
        ArrayList<String> numbers = new ArrayList<String>();
        for (ArrayList<String> posability : gridRow) {
            if (posability.size() == 1) {
                numbers.add(posability.get(0));
            }
        }
        System.out.println("numbers - " + numbers);


        for (ArrayList<String> posability : gridRow) {
                posability.removeAll(numbers);
        }
        System.out.println("newgrid - " + gridRow);

编辑: 当起始索引第一次等于0时:

  

网格行-[[1、2、3、4、5、6、7、8、9],[1、2、3、4、5、6、7、8、9],[4] ,[3],[1、2、3、4、5、6、7、8、9],[1、2、3、4、5、6、7、8、9],[2],[ 1、2、3、4、5、6、7、8、9],[9]]

     

数字-[4、3、2、9]

然后正确打印出来:

  

newgrid-[[1、5、6、7、8],[1、5、6、7、8],[],[],[1、5、6、7、8],[1 ,5、6、7、8],[],[1、5、6、7、8],[]]

但是,当起始索引在起始处等于1时:

  

gridrow-[[1,5,6,7,8],[1,5,6,7,8],[5],[1,5,6,7,7,8],[1,5 ,6、7、8],[9],[1、5、6、7、8],[1、5、6、7、8],[1]]

而不是预期的

  

[[1、2、3、4、5、6、7、8、9],[1、2、3、4、5、6、7、8、9],[5],[1 ,2、3、4、5、6、7、8、9],[1、2、3、4、5、6、7、8、9],[9],[1、2、3、4 ,5、6、7、8、9],[1、2、3、4、5、6、7、8、9],[1]]

由于某些原因,该部分的列表中的前几个数字应保留不变,因此仅减去新的数字集。

第二次修改: 我已经添加了行

numbers.clear();

但是我仍然有同样的问题。 我已经打印出数字列表,并检查每次都清除了该列表,但是主列表似乎在第一个“ posability.removeAll(numbers);”上已更改。

编辑3: 我现在已经解决了,问题出在ArrayList和Sublists。更改列表后,将创建一个新的ArrayList深度拷贝,而不是仅引用旧的即可,代码效果很好。

List<List<String>> posabilityGridClone = posabilityGrid.stream().map(it -> new ArrayList(it)).collect(Collectors.toList());
        gridRow.addAll((Collection<? extends ArrayList<String>>) (posabilityGridClone.subList(initialIndex, initialIndex+9)));

1 个答案:

答案 0 :(得分:0)

添加numbers.clear()作为主循环的最后一行。您的numbers数组在周期之间保持不变,如果我正确理解您期望得到的结果,那就是问题。

编辑 抱歉,我最初没有看到数字。我虽然是超出范围创建的。

您的问题实际上在这一行:

gridRow.addAll((posabilityGrid.subList(initialIndex, initialIndex+9)));

创建子列表时,这里有两个问题:

1)子列表只是同一数组的视图。 (从子列表中删除元素会影响原始列表)

2)数组的元素是对另一个数组的引用。因此,当您运行removeAll时,实际上是将其全部从原始数组中删除。

您需要做的是对阵列的阵列进行深拷贝,并使用它代替原始阵列。

List<List<String>> posabilityGridClone = posabilityGrid.stream().map(it -> new ArrayList(it)).collect(Collectors.toList());
gridRow.addAll((posabilityGridClone.subList(initialIndex, initialIndex+9)));