加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java 8 – 合并包含公共元素的所有子集

发布时间:2020-12-15 08:28:14 所属栏目:Java 来源:网络整理
导读:从一组“组”开始: SetSetString groups = new HashSet(); 我想通过将所有子集与公共元素合并来创建新的集合列表: 即从下面的集合开始: A = {a,b,c}B = {c,d,e,f}C = {f,g,h,i,j}D = {k,l,m}E = {m,n,o}F = {p,q,r} 最终结果将是: Set 1 = {a,c,f,j}Set
从一组“组”开始:

Set<Set<String>> groups = new HashSet<>();

我想通过将所有子集与公共元素合并来创建新的集合列表:

即从下面的集合开始:

A = {a,b,c}
B = {c,d,e,f}
C = {f,g,h,i,j}
D = {k,l,m}
E = {m,n,o}
F = {p,q,r}

最终结果将是:

Set 1 = {a,c,f,j}
Set 2 = {k,m,o}
Set 3 = {p,r}

任何关于如何实现这一点的建议将不胜感激.

编辑:如果设置不均匀,它将执行相同的操作.所以如果它是一个方法,它的伪似如下:

public void doStuff(){

  Set<Set<String>> groups = {{a,c},{c,f},{m,o}}

  Set<Set<String>> newGroups = mergeSubsets(groups);

  System.out.println(newGroups);
}

public Set<Set<String>> mergeSubsets(Set<Set<String>> groups){

     //some operations

}

控制台出:

New Groups: {{a,o}}

解决方法

这是基于@NiksVij解决方案的必要方法.显然@NiksVij的解决方案不正确,这个答案旨在解决这个问题并扩展一点:

public class MergeSet {

    public static void main(String... args) {
        List<Set<String>> list = new ArrayList<>();
        String[] A = {"a","c","e","g"};
        String[] B = {"b","d","f","h"};
        String[] C = {"c","f"};
        String[] D = {"b"};

        list.add(new HashSet<>(Arrays.asList(A)));
        list.add(new HashSet<>(Arrays.asList(C)));
        list.add(new HashSet<>(Arrays.asList(B)));
        list.add(new HashSet<>(Arrays.asList(D)));

        List<Set<String>> newGroups = merge(list);
        System.out.println(newGroups);

    }

    @SuppressWarnings("empty-statement")
    private static <T> List<Set<T>> merge(List<Set<T>> list) {
        if (list == null || list.isEmpty()) {
            return list;
        }
        List<Set<T>> merged = new ArrayList<>();
        do {
            merged.add(list.get(0));
            list.remove(0);

            while (mergeStep(merged.get(merged.size() - 1),list));
        } while (!list.isEmpty());
        return merged;
    }

    private static <T> boolean mergeStep(Set<T> setToCheck,List<Set<T>> remainingList) {
        boolean atLeastOnceMerged = false;
        Iterator<Set<T>> iterator = remainingList.iterator();
        while (iterator.hasNext()) {
            Set<T> elements = iterator.next();
            boolean doMerge = !Collections.disjoint(elements,setToCheck);
            if (doMerge) {
                atLeastOnceMerged |= doMerge;
                setToCheck.addAll(elements);
                iterator.remove();
            }
        }
        return atLeastOnceMerged;
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读