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)?

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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.