gpt4 book ai didi

Java ArrayList.removeAll()

转载 作者:太空宇宙 更新时间:2023-11-04 09:57:05 26 4
gpt4 key购买 nike

我想要编写一段代码,它接受一个列表列表,将其拆分为 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时:

grid row - [[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]]

numbers - [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, 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)));

最佳答案

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

编辑抱歉,我一开始没有看到数字。我认为它是超出范围创建的。

你的问题实际上是在这一行:

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

当您创建子列表时,您会遇到两个问题:

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

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

您需要的是对数组数组进行深度复制并使用它而不是原始数组。

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

关于Java ArrayList.removeAll(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53982402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com