基于Java中的交叉点的联合集

时间:2018-01-03 18:36:30

标签: java arrays set 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作为交点。

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

1 个答案:

答案 0 :(得分:0)

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

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)并在时间上从origSets中提取一组(每次我们检查交集时,如果我们将它们联合起来并将其添加到空集中(allSets)。