Skróć listę do podanej liczby elementów

120

Jaka metoda obcina listę - na przykład do pierwszych 100 elementów - odrzucając pozostałe (bez iteracji przez poszczególne elementy)?

Sam
źródło

Odpowiedzi:

141

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

Należy pamiętać, że subListzwraca widok elementów, więc jeśli chcesz, aby reszta listy kwalifikowała się do wyrzucania elementów bezużytecznych, skopiuj żądane elementy do nowego List:

List<String> subItems = new ArrayList<String>(items.subList(0, 2));

Jeśli lista jest krótsza niż określony rozmiar, spodziewaj się wyjątku poza zakresem . Wybierz minimalną wartość żądanego rozmiaru i aktualny rozmiar listy jako indeks końcowy.

Na koniec zwróć uwagę, że drugi argument powinien być o jeden większy niż ostatni pożądany indeks.

Ben Lings
źródło
1
chociaż pytanie nie jest do końca jasne, wygląda na to, że Sam chce usunąć koniec listy. Dlatego twoja odpowiedź powinna zawierać list.clear ().
mP.
To raczej nie będzie działać tak dobrze jak rozwiązanie karim79, które jest najlepszą alternatywą - ma największe szanse na dobre działanie i jest również najczystszym kodem.
Lawrence Dol
Myślę, że zależy to od liczby elementów do usunięcia (a także od tego, czy lista obsługuje modyfikację)
Ben Lings
1
Jeśli Java 8 jest opcją, myślę, że Stream.limitpowinno załatwić sprawę ( docs.oracle.com/javase/8/docs/api/java/util/stream/… )
Eran Medan
53
list.subList(100, list.size()).clear();

lub:

list.subList(0, 100);
karim79
źródło
3
Pierwsza opcja modyfikuje listę, a druga nie. Powinno byćlist = list.subList(0, 100)
nessa.gp
3
Zauważ również, że subList(100, list.size()).clear()zadziała tylko wtedy, gdy lista ma zaimplementowaną metodę clear, na przykład jeśli utworzysz listprzez List<String> list = Arrays.asList(someString.split(","));clear (), wyrzuci, UnsupportedOperationExceptionponieważ listbędzie abstrakcyjny List.
Gyuri,
Jeśli chcesz zachować początkowe n elementów listy, powinno to byćlist.subList(n, list.size()).clear();
Chaklader Asfak Arefe
1
Szkoda, że ​​musisz stworzyć obiekt tylko po to, aby skrócić listę
David Bradley
1
@DavidBradley Prawda, ale HotSpot może to zoptymalizować
Stefan Reich
8

subList, jak sugerowano w innych odpowiedziach, jest pierwszą, która przychodzi na myśl. Sugerowałbym również podejście strumieniowe .

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.
źródło