Schneiden Sie eine Liste auf eine bestimmte Anzahl von Elementen ab

120

Welche Methode schneidet eine Liste - zum Beispiel auf die ersten 100 Elemente - ab und verwirft die anderen (ohne einzelne Elemente zu durchlaufen)?

Sam
quelle

Antworten:

141

Verwendung 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 );
  }
}

Sie sollten berücksichtigen, dass subListeine Ansicht der Elemente zurückgegeben wird. Wenn Sie also möchten, dass der Rest der Liste für die Speicherbereinigung geeignet ist, sollten Sie die gewünschten Elemente in ein neues 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 eine Ausnahme außerhalb der Grenzen . Wählen Sie den Mindestwert der gewünschten Größe und die aktuelle Größe der Liste als Endindex.

Beachten Sie zum Schluss, dass das zweite Argument eins mehr als der zuletzt gewünschte Index sein sollte.

Ben Lings
quelle
1
Obwohl die Frage nicht genau klar ist, hört es sich so an, als ob Sam das Ende der Liste löschen möchte. Daher sollte Ihre Antwort eine list.clear () enthalten.
mP.
Dies funktioniert wahrscheinlich nicht so gut wie die Lösung von karim79, die die beste Alternative darstellt - sie hat die besten Chancen auf eine gute Leistung und ist auch der sauberste Code.
Lawrence Dol
Ich denke, es hängt von der Anzahl der zu entfernenden Elemente ab (und auch davon, ob die Liste Änderungen unterstützt)
Ben Lings
1
Wenn Java 8 eine Option ist, Stream.limitsollte ich den Trick machen ( docs.oracle.com/javase/8/docs/api/java/util/stream/… )
Eran Medan
53
list.subList(100, list.size()).clear();

oder:

list.subList(0, 100);
karim79
quelle
3
Die erste Option ändert die Liste, die zweite nicht. Es sollte seinlist = list.subList(0, 100)
nessa.gp
3
Beachten Sie auch, dass dies subList(100, list.size()).clear()nur funktioniert, wenn die Methode clear in list implementiert ist. Wenn Sie beispielsweise listmit List<String> list = Arrays.asList(someString.split(","));clear () erstellen , wird dies ausgelöst, UnsupportedOperationExceptionda listes sich um eine Zusammenfassung handelt List.
Gyuri
Wenn Sie die ersten n Elemente der Liste list.subList(n, list.size()).clear();
behalten möchten
1
Schade, dass Sie ein Objekt erstellen müssen, um eine Liste zu verkürzen
David Bradley
1
@ DavidBradley Stimmt, aber HotSpot kann dies tatsächlich optimieren
Stefan Reich
8

subList, wie in den anderen Antworten vorgeschlagen, ist das erste, was mir in den Sinn kommt. Ich würde auch einen Stream-Ansatz vorschlagen .

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
Ousmane D.
quelle