判断List>中set是否有交集 有的话就取并集 返回合并后的List 集合

发布于 2022-09-12 04:52:03 字数 511 浏览 28 评论 0

java多个集合之间如果有交集就合并, 然后返回合并后的list

现在有List<Set<String>> list 集合

Set<Integer> set1 = new HashSet<Integer>() {{
    add(1);
    add(3);
    add(4);
}};

Set<Integer> set2 = new HashSet<Integer>() {{
    add(1);
    add(2);
    add(3);
}};

...
set3
set4

list.add(set1);
list.add(set2);
list.add(set3);
list.add(set4);
...

现在的需求是 判断list中的set是不是相互有交集, 只要有一个相同元素的set 就合并取并集放到newSet1 中 最后期望返回的是合并后的List<newSet>

请大佬指教, 有什么好的算法可以实现

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

也只是曾经 2022-09-19 04:52:04

直接求重复算了,简单明了

@Test
public void setTest(){
    Set<Integer> one = Sets.newHashSet(1,2,3);
 Set<Integer> two = Sets.newHashSet(1,4,3);
 List<Set<Integer>> list = Lists.newArrayList(one,two);
 Set<Integer> three = list.stream().flatMap(Collection::stream).filter(predicate()).collect(Collectors.toSet());
 System.out.println(three);
}
private Predicate<Integer> predicate(){
    Set<Integer> set = Sets.newHashSet();
 return i->!set.add(i);
}
数理化全能战士 2022-09-19 04:52:04

楼上貌似不太符合题主的意思,楼上只是把两个set合并,那完全不需要那么复杂啊:
one.addAll(two);

题主的意思是Set列表中只要两个Set中存在重复就合并,否则不合并,说说我的思路:
1、首先按Set的size降序排序;
2、然后两两比较,存在重复就合并(并将被合并的Set删除),否则继续;

实现代码如下:

List<Set<Integer>> setList = new ArrayList<>();
setList.sort(Comparator.comparingInt(Set::size));
Set<Integer> temp = new HashSet<>();
for (int i = setList.size() - 1; i > 0; i--) {
    Set<Integer> p = setList.get(i);
    for (int j = 0; j < i; j++) {
        if (setList.get(j).isEmpty()) {
            continue;
        }
        temp.clear();
        temp.addAll(p);
        // 差集不为空说明存在相同元素
        // removeAll返回值表明temp集合是否有变化,true:有变化,说明有差集
        if (temp.removeAll(setList.get(j))) {
            p.addAll(setList.get(j));
            // 只清空,先不将其从List中remove
            setList.get(j).clear();
        }
    }
}
setList.stream().filter(s->!s.isEmpty()).forEach(System.out::println);

觉得有用就直接拷走吧,有问题可以沟通,望采纳!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文