2017-11-25 290 views
-1

我是新来的Java和我试图(和 - apparently-失败),如果他们有共同的要素两个字符串组结合:如何在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); 
} 

现在,我正在申请同样的事情,虽然我现在有套一个ArrayList:

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,所以列表条目编号i取列表条目编号i + j的值。

+0

这是因为'retainAll'你'myList.get调用(我)'修改的列表。除非你告诉它,否则你认识到'Object'的变量赋值不会复制? – bcsb1001

+0

@Dichard:我想要一个工会,但我首先要检查是否有交叉点,因为我不想要交叉点(两个集合加在一起)或交叉点(只存在于两个元素中) – Richard

+0

@ Richard:如果它们没有至少一个共同的元素,则要合并这些集合。 – Wiesel

回答

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 ; 
} 
+0

对不起...该代码既不提供交集也不提供工会...只是s1'的副本... – Vadim

0
  1. 当您将Set1指定为commonElements时,您不会复制Set1。 CommonElements只是对相同Set1的另一个参考。所以,

commonElements.retainAll(Set2);

叶SET1和SET2 之间只有共同的元件在SET1

相反
  • SetList保持唯一对象则:
  • 现在Set1只有共同的对象(即Set2有他们作为井)

    而且从Set2最后Set1.addAll(Set2);其余认沽对象Set1

    所有Set1后持有确切相同的对象为Set2


    而不是Set<String> commonElements = myList.get(i);

    做到这一点:

    Set<String> commonElements = new HashSet<String>(); commonElements.addAll(myList.get(i));

    然后你会在最后得到一个独特的联盟。

    顺便说一句:在Java中有一个标准的命名约定,没有命名变量大写。大写的名字是用于类型 - 我的意思是使用set1而不是Set1,因为您正确地使用了commonElements

    相关问题