如何从列表中删除列表的子集和重复项?

问题描述 投票:0回答:1

我有一个名为 MyObject 的类

public class MyObject {
    private int id;
    ...
}

还有一个名为 myList 的列表列表,其中包含 MyObject 的实例:

List<List<MyObject>> myList;

我需要编写一个方法来删除该列表中存在的所有子集和重复项,并与同一列表进行比较。 例如,如果有一个包含 ID 的列表:

4 10 12

还有另一个带有 ID 的列表:

4 12

我需要删除该列表。然而类似:

2 4 12

不应删除。

我见过不同的解决方案,但我无法让它们适合我的情况。有人可以帮忙吗?

java algorithm sorting arraylist
1个回答
1
投票

可能有更有效的方法来做到这一点,但这似乎有效。

  • 首先分配一个列表来存放要删除的列表。
  • 然后按长度逆序对列表进行排序。这确保只有较大的列表才会检查它们是否包含较小的列表。
  • 使用嵌套循环,迭代两个列表,在外循环之前开始内循环索引(无需查看列表是否包含其自身)。
  • 现在比较两个列表。如果包含为真,则将该列表添加到要删除的列表中。
  • 完成后,删除重复的列表
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
异常。使用具有迭代器和循环的混合解决方案时也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.