2017-02-11 3 views
0

ich eine Frage habe, habe ich zwei HashSets,Vergleich 2 HashSets für gemeinsames Objekt

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

Und ich würde überprüfen möchten, ob ein „String“ in list1 in list2 vorhanden ist. Was wäre der schnellste Weg, dies zu schaffen? Wenn man bedenkt, dass beide Sets über 10k Strings haben, wäre etwas relativ schnelles gut.

Jede Hilfe wird geschätzt!

+1

Ich würde einen '' Set' list' nicht nennen - ist verwirrend. –

+1

'list2.retainAll (list1)'. –

Antwort

2

Wenn Sie überprüfen wollen, ob es ist jede Zeichenfolge in list1, die auch in list2 ist, können Sie einfach

!Collections.disjoint(list1, list2) 

schreiben, die wahr ist, wenn sie keine Elemente gemeinsam haben. Wenn Sie die Antwort finden wollen, tun nur die einfache Schleife:

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

Ja danke! aber ich möchte auch, was das String ist – Noksuu

+0

Dann tun Sie einfach eine Schleife: 'für (String str: list1) {if (list2.contains (str)) {return str; }} '... die sowieso das gleiche macht, und du wirst nicht effizienter werden. (Obwohl ehrlich 10k Elemente ist nicht groß genug, um sich Sorgen zu machen.) –

+0

@BoristheSpider es scheint nicht wert, um die Datenstruktur zu mutieren, wenn es nicht wirklich notwendig ist? Die einfache Schleife macht den Job gut. –

0

Eine weitere Option ist Set Einschränkung zu verwenden Duplikat hinzuzufügen. Die Methode add() hilft Ihnen, alle identischen Zeichenfolgen zu finden.

Fügt das angegebene Element zu diesem Set hinzu, wenn es nicht bereits vorhanden ist (optionale Operation). Formaler fügt das angegebene Element e diese Menge hinzu, wenn die Menge kein Element e2 enthält, so dass (e == null? e2 == null: e.equals (e2)). Wenn dieser Satz bereits das Element enthält, verlässt der Aufruf den Satz unverändert und gibt false zurück. In Kombination mit der Einschränkung für Konstruktoren wird dadurch sichergestellt, dass die Sätze keine doppelten Elemente enthalten.

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); 
    }