Angenommen, ich habe eine konstante Anzahl von Sammlungen (z. B. 3 ArrayLists) als Mitglieder einer Klasse. Jetzt möchte ich alle Elemente anderen Klassen aussetzen, damit sie einfach über alle Elemente iterieren können (idealerweise schreibgeschützt). Ich verwende Guavensammlungen und frage mich, wie ich mit Guaven-Iterablen / Iteratoren eine logische Ansicht der internen Sammlungen erstellen kann , ohne temporäre Kopien zu erstellen.
java
collections
guava
Newgre
quelle
quelle
Antworten:
Mit Guava können
Iterables.concat(Iterable<T> ...)
Sie eine Live-Ansicht aller iterierten Elemente erstellen, die zu einer verkettet sind (wenn Sie die iterablen Elemente ändern, ändert sich auch die verkettete Version). Wickeln Sie dann die verkettete iterable mit einIterables.unmodifiableIterable(Iterable<T>)
(ich hatte die schreibgeschützte Anforderung zuvor nicht gesehen).Aus den
Iterables.concat( .. )
JavaDocs:Dies bedeutet zwar nicht ausdrücklich, dass es sich um eine Live-Ansicht handelt, der letzte Satz impliziert jedoch, dass dies der Fall ist (die Unterstützung der
Iterator.remove()
Methode nur, wenn der Backing-Iterator dies unterstützt, ist nur mit einer Live-Ansicht möglich).Beispielcode:
Ausgabe:
Bearbeiten:
Auf Anfrage von Damian gibt es eine ähnliche Methode, die eine Live-Sammlungsansicht zurückgibt
quelle
Iterables.unmodifiableIterable(iterable)
Iterables.concat
produziert einIterable
, nichtCollection
. Ich würde eineCollection
Aussicht brauchen .size()
ist was ich brauche.add()
Eine Ausnahme auszulösen ist gut - diese Methode interessiert mich nicht. Die Sammlungs-API ist defekt und niemand kann etwas dagegen tun.Collection.add()
,Iterator.remove()
, Blah.Einfache Java 8-Lösungen mit a
Stream
.Konstante Zahl
Vorausgesetzt
private Collection<T> c, c2, c3
.Eine Lösung:
Eine andere Lösung:
Variable Nummer
Angenommen
private Collection<Collection<T>> cs
:quelle
Wenn Sie mindestens Java 8 verwenden, lesen Sie meine andere Antwort .
Wenn Sie bereits Google Guava verwenden, lesen Sie die Antwort von Sean Patrick Floyd .
Wenn Sie mit Java 7 nicht weiterkommen und Google Guava nicht einbinden möchten, können Sie Ihre eigenen (schreibgeschützten)
Iterables.concat()
Dateien mit nicht mehr alsIterable
und schreibenIterator
:Konstante Zahl
Variable Nummer
quelle
Sie könnten ein neues
List
undaddAll()
von Ihren anderen dazu erstellenList
. Geben Sie dann eine nicht veränderbare Liste mit zurückCollections.unmodifiableList()
.quelle
ArrayList
ordnen nur den Speicherplatz und die AnrufeSystem.arraycopy()
unter der Haube zu. Effizienter geht es nicht.Hier ist meine Lösung dafür:
BEARBEITEN - Code ein wenig geändert
quelle
hasNext()
undnext()
. Der erste ändert den Status Ihres Iterators, der zweite nicht. Es sollte umgekehrt sein. Der Aufrufnext()
ohne AufrufhasNext()
wird immer nachgebennull
. Wenn SiehasNext()
anrufen, ohne anzurufen,next()
werden Elemente weggeworfen. Sienext()
werfen auchNoSuchElementException
nicht, sondern kehren zurücknull
.