Troncare un elenco a un determinato numero di elementi


120

Quale metodo tronca un elenco, ad esempio ai primi 100 elementi, scartando gli altri (senza iterare tra i singoli elementi)?

Risposte:


141

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

Tieni presente che subListrestituisce una visualizzazione degli elementi, quindi se vuoi che il resto dell'elenco sia idoneo per la raccolta dei rifiuti, dovresti copiare gli elementi che desideri in un nuovo List:

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

Se l'elenco è più corto della dimensione specificata, aspettati un'eccezione fuori limite . Scegli il valore minimo della dimensione desiderata e la dimensione corrente dell'elenco come indice finale.

Infine, nota che il secondo argomento dovrebbe essere uno in più dell'ultimo indice desiderato.


1
anche se la domanda non è esattamente chiara, sembra che Sam voglia cancellare la fine della lista. Pertanto la tua risposta dovrebbe includere un list.clear ().
mP.

È improbabile che questo funzioni bene come la soluzione di karim79, che è la migliore alternativa: ha le migliori possibilità di funzionare bene ed è anche il codice più pulito.
Lawrence Dol

Penso che dipenda dal numero di elementi da rimuovere (e anche se l'elenco supporta la modifica)
Ben Lings

1
Se Java 8 è un'opzione, penso che Stream.limitdovrebbe fare il trucco ( docs.oracle.com/javase/8/docs/api/java/util/stream/… )
Eran Medan

53
list.subList(100, list.size()).clear();

o:

list.subList(0, 100);

3
La prima opzione modifica l'elenco mentre la seconda no. list = list.subList(0, 100)
Dovrebbe

3
Nota anche che subList(100, list.size()).clear()funzionerà solo se list ha implementato il suo metodo clear, ad esempio se crei listcon List<String> list = Arrays.asList(someString.split(","));clear () verrà generato UnsupportedOperationExceptionpoiché listsarà un abstract List.
Gyuri

Se desideri mantenere gli iniziali n elementi della lista, dovrebbe esserelist.subList(n, list.size()).clear();
Chaklader Asfak Arefe

1
Peccato che tu debba creare un oggetto solo per abbreviare una lista
David Bradley

1
@DavidBradley Vero, ma HotSpot potrebbe effettivamente ottimizzarlo
Stefan Reich

8

subList, come suggerito nelle altre risposte, è il primo che mi viene in mente. Suggerirei anche un approccio al flusso .

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.