Einen ListIterator auf die ersten N Elemente beschränken (optimiert)

7

Was ist eine einfache und schnelle Möglichkeit, einen Iterator zu erhalten, der am Anfang von List ?

zu den meisten N-Elementen zurückkehrt?

Die einfachsten Versionen, die ich mir vorstellen kann, sind:

# 1:

%Vor%

# 2:

%Vor%

Leider erzeugen beide Versionen ein temporäres List , was die Leistung erheblich beeinträchtigt, da ich diese Methode millionenfach in einer engen Schleife anrufe.

Gibt es noch andere Bibliotheksfunktionen, die ich dafür verwenden könnte?

Hinweis: Ich kann nicht vermeiden, über die Liste zu iterieren, da ich sie an eine Methode übergebe, die einen Iterator als Argument verwendet und diese Klasse nicht ändern kann.

    
finnw 24.10.2009, 18:56
quelle

7 Antworten

8

Scheint als ob feature wird zur guava hinzugefügt, derzeit (ab r06) in der Beta:

%Vor%     
Werner Lehmann 05.08.2010, 01:29
quelle
14

Sie wissen bereits, dass es sich um eine Liste handelt. Sie können also einfach die Methode List.subList(int fromIndex, int toIndex) aufrufen. Gemäß der Spezifikation wird die Unterliste von der ursprünglichen Liste unterstützt, so dass es nicht wirklich ein vollwertiges List erstellt, sondern nur eine Art Proxy-Objekt.

    
RichN 24.10.2009 19:16
quelle
5

Dies ist ein Ort, an dem ein Dekorierer sehr gut funktioniert: Ihr Dekorator behält eine Zählung bei, die um% co_de erhöht wird %, und verwendet von control next() .

Beispiel (absichtlich unvollständig):

%Vor%     
kdgregory 24.10.2009 18:59
quelle
5

Warum nicht einfach

%Vor%

Ich bin nicht sicher, warum Sie sich um die Erstellung dieser vorläufigen Liste kümmern. Es tut nichts, was ich als teuer erachten würde. In der Tat ist das Erstellen dieser Liste bei weitem billiger als das Iterieren darüber, was ich annehme, dass Sie tun.

    
meriton 24.10.2009 19:14
quelle
2

Die Methode ArrayList.sublist(int,int) erstellt keine Kopie der ursprünglichen Liste. Stattdessen wird eine SubList-Instanz zurückgegeben, die die ursprüngliche ArrayList umschließt. Der Iterator, der von der aus Array abgeleiteten Teilliste zurückgegeben wird, erstellt auch keine Kopie.

Ich empfehle also, ArrayList als Basislistentyp und sublist zu verwenden. Wenn das nicht schnell genug ist, implementieren Sie Ihre eigene Variante von ArrayList , die eine limitedLengthIterator -Methode implementiert. Zum Beispiel sollten Sie in der Lage sein, den Code loszuwerden, der nach gleichzeitigen Änderungen sucht.

    
Stephen C 25.10.2009 14:27
quelle
1

Wenn Sie Bedenken hinsichtlich der Leistung haben, verwenden Sie keinen Iterator, verwenden Sie einen Index für ein Array. Dies wird zu einer viel besseren Leistung führen. Die ersten N Elemente eines Arrays zu erhalten ist trivial.

    
Peter Lawrey 25.10.2009 14:01
quelle
0

Diese Version erweist sich als schneller als jedes der anderen Beispiele:

%Vor%

Wenn die temporäre Liste trotzdem erstellt werden muss, ist ein ArrayList schneller als die dekorierten Listen, die von den anderen Bibliotheksmethoden zurückgegeben werden.

Ich vermute, dass ArrayList in der VM eine spezielle Behandlung bekommt.

Vielleicht wäre das für sehr lange Listen ineffizient, aber meine Listen sind kurz (fast immer weniger als 50 Elemente).

    
finnw 25.10.2009 12:17
quelle

Tags und Links