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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |