我想编写一段包含列表列表的代码,将其分成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)));
答案 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)));