2008-10-02 6 views
59

Gibt es eine integrierte Funktionalität für klassische Mengenoperationen in der java.util.Collection-Klasse? Meine spezifische Implementierung wäre für ArrayList, aber das klingt nach etwas, das für alle Unterklassen von Collection gelten sollte. Ich suche nach etwas wie:Klassische set-Operationen für java.util.Collection

ArrayList<Integer> setA ... 
ArrayList<Integer> setB ... 
ArrayList<Integer> setAintersectionB = setA.intersection(setB); 
ArrayList<Integer> setAminusB = setA.subtract(setB); 

Nach einigem Suchen konnte ich nur selbstgewachsene Lösungen finden. Mir ist auch klar, dass ich die Idee eines "Sets" mit der Idee einer "Sammlung" verwechseln mag und keine Duplikate zulasse. Vielleicht ist das wirklich nur Funktionalität für die Set-Oberfläche?

Für den Fall, dass niemand von einer integrierten Funktionalität weiß, könnten wir dies möglicherweise als Repository für den Standard-Java-Set-Operationscode verwenden? Ich kann mir vorstellen, dass dieses Rad mehrmals neu erfunden wurde.

Antwort

101

Kreuzung ist mit Collection.retainAll; Subtraktion mit Collection.removeAll; Vereinigung mit Collection.addAll. In jedem Fall, als Set wird wie ein Satz handeln und eine List wird wie eine Liste handeln.

Als veränderbare Objekte arbeiten sie an ihrem Platz. Sie müssen explizit kopieren, wenn Sie das ursprüngliche veränderbare Objekt unmutiert beibehalten möchten.

7

Suchen Sie nach java.util.Set Schnittstelle (und seine Implementierungen HashSet und TreeSet (sortiert))?
Die Schnittstelle definiert removeAll (Collection c), die aussieht wie subtract(), und retainAll (Collection c), die wie eine Kreuzung aussieht.

+0

Bessere Verbindung (Java 6 docs): http: //java.sun. com/javase/6/docs/api/java/util/Set.html –

+2

Gute Antwort. Diese ändern jedoch einen der beiden Sätze. Wenn Ross eine dritte Menge wünscht, die die Lösung enthält, muss Er zuerst eine klonen und sie als implizite Variable verwenden. –

+0

mmyer, danke, dass ich darauf hingewiesen habe, ich habe immer noch eine Registerkarte auf Java 1.5 Docs geöffnet, um mit Processing zu spielen, und ich werde zu oft von diesen verflixten Framesets gebissen. Der Link ist festgelegt. – PhiLho

15

Ich würde Google Guava empfehlen. Die Sets Klasse scheint genau das zu haben, wonach Sie suchen. Es hat eine intersection Methode und eine difference Methode.

This presentation ist wahrscheinlich etwas, das Sie sehen möchten, wenn Sie interessiert sind. Es bezieht sich auf Google Collections, der ursprüngliche Name von Guava.

5

Für veränderbare Operationen siehe akzeptierte Antwort.

Für eine imutable Variante Sie diese

8 mit Java tun

Subtraktion

set1 
    .stream() 
    .filter(item-> !set2.contains(item)) 
    .collect(Collectors.toSet()) 

Kreuzung

set1 
    .stream() 
    .filter(item-> set2.contains(item)) 
    .collect(Collectors.toSet())