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

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>

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

阅读 5.4k
2 个回答

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

@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);
}

楼上貌似不太符合题主的意思,楼上只是把两个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);

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题