假设我有一个元素对列表,例如 (1, 2) (3, 4),其中不存在重复项,并且对于一对 (p, q) p != q。如何使用简单的代码从这些元素中形成一个集合(我不打算使用像不相交集合和联合这样的数据结构,而是使用 java 库 API——除非代码可以以简单的方式编写)。示例: (1, 2) (2, 4) (5, 6) (4, 7) (3, 5) 应该输出: {1, 2, 4, 7} 和 {3, 5, 6}
List<Set<Integer>> list = new ArrayList<>();
for(String s : pairs){
String[] values = s.split(" ");
Integer val1 = Integer.parseInt(values[0]);
Integer val2 = Integer.parseInt(values[1]);
Set<Integer> pairSet = new HashSet<>();
pairSet.add(val1);
pairSet.add(val2);
boolean exists = false;
for(Set<Integer> set : list){
if(set.contains(val1) || set.contains(val2)) {
set.addAll(pairSet);
exists = true;
break;
}
}
if(!exists)
list.add(pairSet);
}
这是一种不正确的幼稚方法。如果我得到一个序列 (1 2) (3 4) 和 (2 3),则输出变为 {1, 2, 3} 和 {3, 4}。
发生这种情况是因为集合列表是这样创建的:{1, 2} 然后 {3, 4} 然后当对 (2 3) 出现时,它不会合并 2 个集合。
我可以编写一个代码来检查第一个值是否存在于任何集合中,比如 S1,然后对于另一个值相同,比如 S2,然后合并:
//loop -> s1 = find val1
//loop -> s2 = find val2
if s1 != null and s2 != null //merge s1 and s2
if(s1 == null && s2 != null) //add val1 and val2 to s2
if(s1 != null && s2 == null) //add val1 and val2 to s1
if(both null) create a new set of val1 and val2
太多的循环和条件。有更简单的解决方案吗?