我有一个名为 MyObject 的类
public class MyObject {
private int id;
...
}
还有一个名为 myList 的列表列表,其中包含 MyObject 的实例:
List<List<MyObject>> myList;
我需要编写一个方法来删除该列表中存在的所有子集和重复项,并与同一列表进行比较。 例如,如果有一个包含 ID 的列表:
4 10 12
还有另一个带有 ID 的列表:
4 12
我需要删除该列表。然而类似:
2 4 12
不应删除。
我见过不同的解决方案,但我无法让它们适合我的情况。有人可以帮忙吗?
可能有更有效的方法来做到这一点,但这似乎有效。
List<List<Integer>> lists = new ArrayList<>(List.of(
List.of(7),
List.of(3,7),
List.of(10),
List.of(3,2,1),
List.of(1,2,3,8,9),
List.of(1,2,9),
List.of(1,2,8,9),
List.of(1,2,3,4,5,6),
List.of(1,2,45)));
List<List<Integer>> toBeRemoved = new ArrayList<>();
lists.sort(Comparator.comparing(List::size, Comparator.reverseOrder()));
for(int i = 0; i < lists.size()-1; i++) {
List<Integer> next = lists.get(i);
for (int k = i+1; k < lists.size(); k++) {
List<Integer> current = lists.get(k);
if (!toBeRemoved.contains(current) && next.containsAll(current)) {
toBeRemoved.add(lists.get(k));
}
}
}
lists.removeAll(toBeRemoved);
System.out.println(lists);
打印
[[1, 2, 3, 4, 5, 6], [1, 2, 3, 8, 9], [1, 2, 45], [3, 7], [10]]
我尝试了一些替代方法,例如使用嵌套迭代器来删除发现的列表,但我遇到了
ConcurrentModification
异常。使用具有迭代器和循环的混合解决方案时也是如此。