Union集基于Java中的Intersection

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Union集基于Java中的Intersection相关的知识,希望对你有一定的参考价值。

我正在尝试基于交集的联合集。例如:

我有一套:{[4,5,7],[1,3,4,6],[5,6,8],[40,41],[38,40],[36,37, 41]}

结果应该是:{[1,3,4,7,5,8,6],[40,36,37,41,38]}

注意:前三组有4和6交叉。这同样适用于最后三组,它们有40和41作为交点。

我试图迭代原始集,但迭代时无法修改它。有关如何处理此问题的任何想法?

答案

我想我明白了。如果你认为不对,请告诉我。但是,我正在分享它以防有人正在寻找答案!

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import com.google.common.collect.Sets;;

public class TestSet {

public static Set<Set<Integer>> origSets = new HashSet<Set<Integer>>();
public static Set<Set<Integer>> allSets = new HashSet<Set<Integer>>();

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Set<Integer> set1 = new HashSet<>(Arrays.asList(4, 5, 7));
    Set<Integer> set2 = new HashSet<>(Arrays.asList(1, 3, 4, 6));
    Set<Integer> set3 = new HashSet<>(Arrays.asList(5, 4, 8));
    Set<Integer> set4 = new HashSet<>(Arrays.asList(40, 41));
    Set<Integer> set5 = new HashSet<>(Arrays.asList(38, 40));
    Set<Integer> set6 = new HashSet<>(Arrays.asList(36, 37, 41));
    origSets.add(set1);
    origSets.add(set2);
    origSets.add(set3);
    origSets.add(set4);
    origSets.add(set5);
    origSets.add(set6);



    for (Set<Integer> eachSet : origSets) {
        processSet(eachSet);
    }
    printResult();

}

public static void processSet(Set<Integer> candi) {
    boolean flag = false;
    if (!allSets.isEmpty()) {
        for (Set<Integer> old_set : allSets) {
            Set<Integer> intersected = Sets.intersection(candi, old_set);
            if (!intersected.isEmpty()) {
                addSet(candi, old_set);
                allSets.remove(old_set);
                flag=true;
                break;
            } else {
                continue;
            }
        }
        if(!flag){
            allSets.add(candi);
        }


    } else {
        allSets.add(candi);
    }

}

public static void addSet(Set<Integer> candi, Set<Integer> new_set) {
    Set<Integer> candidate = Sets.union(candi, new_set);
    allSets.add(candidate);

}

public static void printResult(){
    for(Set<Integer> eachSet :allSets){
        System.out.println(eachSet);
    }
}


  }

输出:

[38, 40, 36, 37, 41]
[1, 3, 4, 6, 5, 8, 7]

我们的想法是创建一个新的空集合集(我们称之为allSets)并在时间上从源集合中提供一组(每次我们检查交集时,如果我们将它们联合起来并将其添加到空集(allSets) 。

以上是关于Union集基于Java中的Intersection的主要内容,如果未能解决你的问题,请参考以下文章

mysql union all和union的区别

UVa 1597

union 与 union all 及其他并集操作说明

BigQuery 中的 UNION ALL 或 CONCATENATE 数据集

union和union all的区别

条件查询之or和union