2016-06-11 11 views
0

Ich kämpfe wie grundlegende Operationen mit einer Guava ImmutableSortedMultiset ...Hinzufügen (Entfernen) Element (e) aus einem ImmutableSortedMultiset

  • auszuführen Wie würde man eine Kopie eines bestehenden ImmutableSortedMultiset erstellen, ist enthält eine neue Element?
  • Wie erstellt man eine Kopie eines vorhandenen ImmutableSortedMultiset, wo eines der Elemente entfernt wurde?

Wenn möglich, würde ich diese Operationen in der Lage sein mag, ohne auszuführen, um die bestehende Sammlung hinzugefügt wird das Sortieren jedesmal, wenn ein neues Element (entfernt).

+1

Sie können es nicht tun, ohne die vorhandene Sammlung zu sortieren. (Obwohl ich denke, die Art ist wahrscheinlich O (n) für den Fall von nur einem anderen Element, das ist so gut, wie Sie sowieso bekommen.) –

+2

Dies ist * nicht * die Use Case unveränderlichen Sammlungen sind entworfen um klar zu sein. Sie suchen nach dauerhaften Sammlungen. –

+0

@LouisWasserman Danke für den Tipp. Ich werde für persistente Sammlungen googeln. – davidrpugh

Antwort

1

Ich glaube nicht, dass Sie es tun können, ohne ein neues ImmutableSortedMultiset neu zu erstellen.

// View with one more element 
Multiset<String> view = Multisets.union(original, ImmutableMultiset.of("a")); 

oder

// View with one less element 
Multiset<String> view = Multisets.difference(original, ImmutableMultiset.of("a")); 

gefolgt von Erschaffung der unveränderlichen sortiert Kopie: Angenommen, Sie haben eine original multiset, würde ich, indem eine zusammengesetzte Ansicht unter Verwendung der Verfahren in Multiset starten

ImmutableSortedMultiset<String> copy = ImmutableSortedMultiset.copyOf(view); 
1

Es ist eigentlich eine knifflige Frage, denn soweit ich weiß, bietet Guava keine einfache Methode, um Ihr Ziel zu erreichen. Vielleicht sollten Sie nicht mit unveränderlichen Sammlungen arbeiten, wenn Sie sie ändern müssen. Zum Beispiel können Sie Ihre Daten in veränderbaren SortedMultiset speichern und eine defensive Kopie erstellen, wenn Sie sie irgendwo weitergeben müssen

Diese Operationen sind jedoch weiterhin möglich.

Hinzufügen und Kopie

Um Element in unveränderliche Sammlung hinzuzufügen, müssen Sie Builder

ImmutableSortedMultiset<T> original = ...; //your original data which you want to modify 
T element = ...; //new element which you want to add 
ImmutableSortedMultiset<T> result = ImmutableSortedMultiset.<T>naturalOrder() 
            .addAll(original) //copying original data 
            .add(element) 
            .build(); 

entfernen verwenden und kopieren

Hier Dinge ein wenig härter zu bekommen weil Sie die ursprüngliche Sammlung filtern und das Element ausschließen müssen, das Sie entfernen möchten

ImmutableSortedMultiset<T> original = ...; 
T el = ...; //element which you want to remove 
ImmutableSortedMultiset<T> result = ImmutableSortedMultiset.copyOf(//copy... 
           Collections2.filter(original, //and filter 
           Predicates.not(Predicates.equalTo(el))); 

Sie müssen dies in eine Methode einfügen, um die Verwendung zu vereinfachen.

Allerdings empfehle ich Ihnen, veränderbare Sammlungen anstelle von unveränderlich zu verwenden, wenn Sie sie wirklich ändern müssen.

+0

Beachten Sie, dass Ihre remove-Version _all_ Elemente gleich "e1" entfernt und nicht nur eins. Denken Sie daran, dass wir mit einem Multiset arbeiten! –

Verwandte Themen