Was ist eine einfache und schnelle Möglichkeit, einen Iterator zu erhalten, der am Anfang einer List
am meisten N Elemente zurückgibt?Begrenzen Sie einen ListIterator auf die ersten N-Elemente (optimiert)
Die einfachsten Versionen ich tun konnte, sind:
# 1:
import com.google.common.collect.Iterators;
// ...
public static <E> Iterator<E> lengthLimitedIterator(Iterable<E> source, int maxLen) {
return Iterators.partition(source.iterator(), maxLen).next().iterator();
}
# 2:
public static <E> Iterator<E> lengthLimitedIterator(List<E> source, int maxLen) {
return source.subList(0, Math.min(source.size(), maxLen)).iterator();
}
Leider beide Versionen eine temporäre List
schaffen, die Leistung erheblich beeinträchtigt als Ich rufe diese Methode millionenfach in einer engen Schleife an.
Gibt es noch andere Bibliotheksfunktionen, die ich dafür verwenden könnte?
Hinweis: ich die Liste nicht vermeiden kann iterieren, wie ich es auf ein Verfahren bin vorbei, die einen Iterator als Argument und ich kann nicht diese Klasse ändern.
Neben 'Iteratoren' ist zu beachten, dass [' Iterables' auch 'limit()' Methode] (http: //docs.guava- libraries.googlecode.com/git/javadoc/com/google/common/collect/Iterables.html#limit(java.lang.Iterable,%20int)). Wenn Sie also eine 'List' haben, ist es am einfachsten,' Iterables.limit (aList, 3) 'zu tun. – Jonik