387 Stimmen

Etwas wie 'enthält jede' für Java-Set?

Ich habe zwei Sätze, A und B, desselben Typs.

Ich muss herausfinden, ob A irgendein Element aus der Menge B enthält.

Wie lässt sich das am besten bewerkstelligen, ohne über die Mengen zu iterieren? Die Set-Bibliothek hat contains(object) y containsAll(collection) , aber nicht containsAny(collection) .

650voto

Frontline Punkte 6295

No Collections.disjoint(A, B) arbeiten? Aus der Dokumentation:

Rückgabe true wenn die beiden angegebenen Sammlungen keine gemeinsamen Elemente haben.

Die Methode liefert also false wenn die Sammlungen gemeinsame Elemente enthalten.

256voto

gpl Punkte 2649

Stream::anyMatch

Seit Java 8 können Sie mit Stream::anyMatch .

setA.stream().anyMatch(setB::contains)

55voto

Yamcha Punkte 1154

Apache Commons hat eine Methode CollectionUtils.containsAny() .

41voto

CaTalyst.X Punkte 1590

Eine gute Möglichkeit, containsAny für Sets zu implementieren, ist die Verwendung des Guava Sets.intersection() .

containsAny würde eine boolean so dass der Aufruf wie folgt aussieht:

Sets.intersection(set1, set2).isEmpty()

Diese Funktion gibt true zurück, wenn die Mengen disjunkt sind, andernfalls false. Die Zeitkomplexität dieser Methode ist wahrscheinlich etwas besser als die von retainAll, da man kein Klonen durchführen muss, um eine Änderung der ursprünglichen Menge zu vermeiden.

28voto

Adam111p Punkte 2983

Ich benutze org.apache.commons.collections.CollectionUtils

CollectionUtils.containsAny(someCollection1, someCollection2)

Das ist alles! Rückgabe wahr wenn mindestens ein Element in beiden Sammlungen enthalten ist.

Einfach zu verwenden, und der Name der Funktion ist vielsagend.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X