如何在Java中合并两个字符串集,但只有它们具有公共元素?

时间:2017-11-25 20:55:26

标签: java arraylist set

我是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的值。

2 个答案:

答案 0 :(得分:0)

  1. unexpected token <分配给Set1时,您不会复制Set1。 CommonElements只是对同一Set1的另一个引用。所以,
  2. commonElements

    在Set1

    中只留下Set1和Set2 之间的公共元素
      commonElements.retainAll(Set2);相反的
    1. Set包含唯一对象:
    2. 现在List只有共同的对象(即Set1也有它们)

      最后Set2将剩余的对象从Set1.addAll(Set2);放到Set2

      毕竟Set1Set1保持完全相同的对象。

      而不是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 ;
}