Ist es möglich, Iteratoren in Java zusammenzuführen?
Ist es möglich, zu verschmelzen Iteratoren in Java? Ich habe zwei Iteratoren und ich wollen kombinieren/verschmelzen Sie, so dass ich Durchlaufen konnte, obwohl Ihre Elemente in einem Arbeitsgang (in der gleichen Schleife) eher als zwei Schritte. Ist das möglich?
Beachten Sie, dass die Anzahl der Elemente in den beiden Listen können unterschiedlich sein, deshalb eine Schleife über beide Listen ist nicht die Lösung.
Iterator<User> pUsers = userService.getPrimaryUsersInGroup(group.getId());
Iterator<User> sUsers = userService.getSecondaryUsersInGroup(group.getId());
while(pUsers.hasNext()) {
User user = pUsers.next();
.....
}
while(sUsers.hasNext()) {
User user = sUsers.next();
.....
}
InformationsquelleAutor der Frage Jahanzeb Farooq | 2010-08-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Guave (ehemals Google Collections) hat Iteratoren.concat.
InformationsquelleAutor der Antwort Andrew Duffy
Könnte man erstellen Sie Ihre eigene Implementierung der
Iterator
- Schnittstelle, die iteriert über die Iteratoren:(Ich habe nicht Hinzugefügt, Generika zu den Iterator für die Kürze.) Die Umsetzung ist nicht allzu schwer, aber ist nicht das trivialste, die Sie benötigen, um zu verfolgen, welche
Iterator
Sie derzeit Durchlaufen, und ruftnext()
müssen Sie Durchlaufen, so weit wie möglich durch die Iteratoren, bis Sie einehasNext()
zurückgibttrue
oder können Sie schlagen das Ende der letzten iterator.ich bin mir nicht bewusst jede Implementierung, die bereits für diese.Update:
Ich habe bis-zum Andrew Duffy ' s Antwort - keine Notwendigkeit, das Rad neu zu erfinden. Ich wirklich brauchen, um sich in die Guave in mehr Tiefe.
Die ich Hinzugefügt habe, einen anderen Konstruktor für eine variable Anzahl von Argumenten - fast immer off-topic, wie die Klasse aufgebaut ist, ist hier nicht wirklich von Interesse, nur das Konzept, wie es funktioniert.
InformationsquelleAutor der Antwort Noel M
Auch die Apache-Commons-Sammlung haben mehrere Klassen für die Manipulation von Iteratoren, wie die IteratorChainumschließt eine Reihe von Iteratoren.
InformationsquelleAutor der Antwort Ither
Ich habe nicht geschrieben, Java-code in eine Weile, und das hat mich neugierig um, ob ich noch "got it".
Erster Versuch:
Du könnte natürlich weitere Collection-Klassen eher als ein reines array + index Zähler, aber das fühlt sich wirklich ein bisschen sauberer als die alternative. Oder bin ich einfach nur voreingenommen schreiben meist C in diesen Tagen?
Sowieso, dort gehen Sie. Die Antwort auf deine Frage ist "ja, wahrscheinlich".
InformationsquelleAutor der Antwort Christoffer
bewegen Sie Ihre loop auf eine Methode, und übergeben Sie die iterator-Methode.
InformationsquelleAutor der Antwort mhshams
einen iterator stammt AUS einer Sammlung oder eine Gruppe.
warum nicht die Methode verwenden, die bereits verfügbar
Collection.addAll(Collection c);
und dann erstellen Sie Ihre iterator vom letzten Objekt.
auf diese Weise werden Ihre iterator iteriert alle Inhalte der Sammlung.
InformationsquelleAutor der Antwort
Ich würde umgestalten der ursprüngliche Entwurf aus:
Etwas wie:
InformationsquelleAutor der Antwort Billworth Vandory
Können Sie meine version einer ausziehbaren iterator. Es verwendet einen double-ended-queue von Iteratoren, die für mich Sinn macht:
InformationsquelleAutor der Antwort Reut Sharabani
Zusammengeführten Iterator:
Den
concat
Methode zum erstellen einerIterable
:Einfachen JUnit-test:
InformationsquelleAutor der Antwort benez
Können Sie versuchen,
ConcatIterator
von Cactoos:Überprüfen Sie auch
ConcatIterable
die verkettetIterable
s.InformationsquelleAutor der Antwort yegor256
public class IteratorJoin implements Iterator {
private final Iterator first, next;
}
InformationsquelleAutor der Antwort clelson
jeder
Iterator
Objekt besitzt eigenen Speicherplatz (Adresse), so kann man nicht einfach "mischen". es sei denn, Sie verlängerniterator
Klasse und schreiben Sie Ihre eigene Implementierung gibt.Wenn Sie Umgang mit den gleiche Anzahl von Objekten in beiden Iteratoren eine alternative Lösung wäre die Verarbeitung von zwei Iteratoren in einer Schleife wie diese :
InformationsquelleAutor der Antwort Youssef