2017-02-11 101 views
0

我有一个问题比较2个HashSets,我有两个HashSets,公共对象

Set<String> list1 = new HashSet<String>(oldList1); 
Set<String> list2 = new HashSet<String>(oldList2); 

,我想检查是否有“串”在list1存在于list2。通过这种方式最快的方法是什么?请记住,两套都有超过10K的字符串,所以相对较快的速度会更好。

任何帮助表示赞赏!

+1

,我不会叫''Set' list' - 是混乱的。 –

+1

'list2.retainAll(list1)'。 –

回答

2

如果你想检查是否有任何字符串list1这也是list2,你可以只写

!Collections.disjoint(list1, list2) 

,如果他们有任何共同的要素哪个是真的。如果你想找到答案,只是做简单的循环:

for (String str : list1) { 
    if (list2.contains(str)) { 
    return str; 
    } 
} 
+0

是的谢谢!但我也想这是什么字符串是 – Noksuu

+0

然后只是做一个循环︰for(String str:list1){if(list2.contains(str)){return str; } ...'无论如何都会做同样的事情,而且你不会比这更有效率。 (虽然坦率地说10k元素不足以担心。) –

+0

@BoristheSpider如果实际上并不需要,它似乎并不需要修改数据结构?简单的循环完成这项工作就好。 –

0

另一种选择是使用设置限制添加重复。方法add()将帮助您找到所有相同的字符串。

将指定元素添加到这个组,如果它不是已存在 (可选操作)。更正式地说,如果该集合不包含元素e2使​​得(e == null? e2 == null:e.equals(e2)),则将该指定的元素e添加到该集合中的 。如果这个集合已经包含元素 ,则该呼叫将保持集合不变并返回false。在组合 与构造函数的限制,这确保集合从不 包含重复的元素。

Set<String> list1 = new HashSet<String>(); 
    list1.add("a"); 
    list1.add("b"); 
    list1.add("c"); 
    Set<String> list2 = new HashSet<String>(); 
    list2.add("b"); 
    list2.add("c"); 
    list2.add("d"); 
    Set<String> listCommon = new HashSet<String>(); 
    for (String element : list2) { 
     if (!list1.add(element)) { 
      listCommon.add(element); 
     } 
    } 
    // all collected duplicates 
    for (String element : listCommon) { 
     System.out.println(element); 
    }