我是Java的新手,如果他们有共同的元素,我会尝试(并且 - 显然 - 失败)组合两个字符串集:
CommonElements = Set1;
CommonElements.retainAll(Set2);
System.out.println("common elements of"+Set1+"and"+Set2+":"+CommonElements);
if (CommonElements.size()!=0) {
Set1.addAll(Set2);
System.out.println("both sets"+Set1);
}
现在,我正在应用同样的东西,虽然我现在有一个数组的List:
for (i=0; i<myList.size(); i++) {
for (int j = 1; j<myList.size()-i; j++) {
Set<String> Set1 = myList.get(i);
System.out.println("Set1"+Set1);
Set<String> Set2 = myList.get(i+j);
System.out.println("Set2"+Set2);
Set<String> commonElements = myList.get(i);
commonElements.retainAll(Set2);
System.out.println("Common elements of"+i+"and"+(i+j)+":"+Set3);
if (commonElements.size()!=0) {
Set1.addAll(Set2);
myList.set(i, Set1);
System.out.println("both sets"+Set1);
}
System.out.println(myList.get(i));
但是System.out.println(myList.get(i))导致:
如果这两组没有任何共同之处: Set1变空,myList.get(i)返回[]。
如果两组确实有共同之处: Set1变为Set2,因此List条目号i取List列号i + j的值。
答案 0 :(得分:0)
unexpected token <
分配给Set1
时,您不会复制Set1。
CommonElements只是对同一Set1的另一个引用。所以, commonElements
在Set1
中只留下Set1和Set2 之间的公共元素commonElements.retainAll(Set2);
相反的Set
包含唯一对象:现在List
只有共同的对象(即Set1
也有它们)
最后Set2
将剩余的对象从Set1.addAll(Set2);
放到Set2
毕竟Set1
与Set1
保持完全相同的对象。
而不是Set2
这样做:
Set<String> commonElements = myList.get(i);
然后你会得到一个独特的UNION。
BTW:在Java中有一个标准的命名约定,不要将变量命名为Capitalized。大写名称适用于类型 - 我的意思是使用Set<String> commonElements = new HashSet<String>();
commonElements.addAll(myList.get(i));
代替set1
,因为您正确使用Set1
。
答案 1 :(得分:0)
有点蛮力,但......
public Set<String> mergeSetsIfAnyOverlap( Set<String> s1, Set<String> s2 ) {
Set<String> s3 = new HashSet<String>( s1 ) ; // copy s3
s3.retainAll( s1 ) ; // keep only things in s3 (aka s1 ) that exist in s2
if( !s3.isEmpty() ) { // any common items ... ?
s3.addAll( s1 ) ; // ... yes than merge
} else {
s3.clear() ; // otherwise empty s3
}
return s3 ;
}