2017-02-11 99 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); 
    }