Welche Methode kürzt eine Liste – zum Beispiel auf die ersten 100 Elemente – und verwirft die anderen (ohne einzelne Elemente zu durchlaufen)?
Kürzt eine Liste auf eine bestimmte Anzahl von Elementen
Sam
Ben Ling
Verwenden List.subList
:
import java.util.*;
import static java.lang.Math.min;
public class T {
public static void main( String args[] ) {
List<String> items = Arrays.asList("1");
List<String> subItems = items.subList(0, min(items.size(), 2));
// Output: [1]
System.out.println( subItems );
items = Arrays.asList("1", "2", "3");
subItems = items.subList(0, min(items.size(), 2));
// Output: [1, 2]
System.out.println( subItems );
}
}
Das sollten Sie bedenken subList
gibt eine Ansicht der Elemente zurück. Wenn Sie also möchten, dass der Rest der Liste für die Garbage Collection geeignet ist, sollten Sie die gewünschten Elemente in eine neue kopieren List
:
List<String> subItems = new ArrayList<String>(items.subList(0, 2));
Wenn die Liste kürzer als die angegebene Größe ist, erwarten Sie ein Out-of-Bounds Ausnahme. Wählen Sie als Endindex den Mindestwert der gewünschten Größe und die aktuelle Größe der Liste.
Beachten Sie schließlich, dass das zweite Argument eins mehr sein sollte als der letzte gewünschte Index.
-
Während die Frage nicht ganz klar ist, klingt es so, als ob Sam ein Ende der Liste löschen möchte. Daher sollte Ihre Antwort eine list.clear() enthalten.
– MP.
14. August 2009 um 23:15 Uhr
-
Dies wird wahrscheinlich nicht so gut funktionieren wie die Lösung von karim79, die die beste Alternative ist – sie hat die besten Chancen auf eine gute Leistung und ist auch der sauberste Code.
– Lawrence Dol
15. August 2009 um 5:08 Uhr
-
Ich denke, es hängt von der Anzahl der zu entfernenden Elemente ab (und auch davon, ob die Liste Änderungen unterstützt).
– Ben Lings
15. August 2009 um 6:50 Uhr
-
Wenn Java 8 eine Option ist, denke ich
Stream.limit
sollte den Trick machen (docs.oracle.com/javase/8/docs/api/java/util/stream/…)– Eran Medan
31. Juli 2017 um 22:38 Uhr
karim79
list.subList(100, list.size()).clear();
oder:
list.subList(0, 100);
-
Die erste Option ändert die Liste, die zweite nicht. Es sollte sein
list = list.subList(0, 100)
– nessa.gp
4. April 2016 um 15:00 Uhr
-
Beachte das auch
subList(100, list.size()).clear()
funktioniert nur, wenn list seine clear-Methode implementiert hat, zum Beispiel if you createlist
durchList<String> list = Arrays.asList(someString.split(","));
clear() wird werfenUnsupportedOperationException
seitlist
wird ein Abstract seinList
.– Guri
14. Oktober 2016 um 18:16 Uhr
-
Wenn Sie die anfänglichen n Elemente der Liste beibehalten möchten, sollte dies der Fall sein
list.subList(n, list.size()).clear();
– Arefe
1. Oktober 2018 um 5:16 Uhr
-
Schade, dass Sie ein Objekt erstellen müssen, nur um eine Liste zu verkürzen
– David Bradley
24. Oktober 2018 um 20:13 Uhr
-
@DavidBradley Stimmt, aber HotSpot kann dies tatsächlich optimieren
– Stefan Reich
8. November 2019 um 0:01 Uhr
subList
, wie in den anderen Antworten vorgeschlagen, ist das erste, was mir in den Sinn kommt. Ich würde auch eine vorschlagen Stream-Ansatz.
source.stream().limit(10).collect(Collectors.toList()); // truncate to first 10 elements
source.stream().skip(2).limit(5).collect(Collectors.toList()); // discards the first 2 elements and takes the next 5