我正在尝试基于交集的联合集。例如:
我有一套:{[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作为交点。
我尝试迭代原始集但在迭代时无法修改它。有关如何处理此问题的任何想法?
答案 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)。