Truncar una lista a un número determinado de elementos

120

¿Qué método trunca una lista, por ejemplo, a los primeros 100 elementos, descartando los demás (sin iterar a través de elementos individuales)?

Sam
fuente

Respuestas:

141

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

Debe tener en cuenta que subListdevuelve una vista de los elementos, por lo que si desea que el resto de la lista sea elegible para la recolección de basura, debe copiar los elementos que desea a un nuevo List:

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

Si la lista es más corta que el tamaño especificado, espere una excepción fuera de los límites . Elija el valor mínimo del tamaño deseado y el tamaño actual de la lista como índice final.

Por último, tenga en cuenta que el segundo argumento debe ser uno más que el último índice deseado.

Ben Lings
fuente
1
Si bien la pregunta no es exactamente clara, parece que Sam quiere que se elimine el final de la lista. Por lo tanto, su respuesta debe incluir un list.clear ().
mP.
No es probable que esto funcione tan bien como la solución de karim79, que es la mejor alternativa: tiene la mejor posibilidad de funcionar bien y es el código más limpio también.
Lawrence Dol
Creo que depende de la cantidad de elementos que se eliminarán (y también si la Lista admite modificaciones)
Ben Lings
1
Si Java 8 es una opción, creo que Stream.limitdebería hacer el truco ( docs.oracle.com/javase/8/docs/api/java/util/stream/… )
Eran Medan
53
list.subList(100, list.size()).clear();

o:

list.subList(0, 100);
karim79
fuente
3
La primera opción modifica la lista, mientras que la segunda no. list = list.subList(0, 100)
Debería
3
También tenga en cuenta que subList(100, list.size()).clear()solo funcionará si list tiene implementado su método claro, por ejemplo, si crea listpor List<String> list = Arrays.asList(someString.split(","));clear () arrojará UnsupportedOperationExceptionya listque será un resumen List.
Gyuri
Si desea mantener los n elementos iniciales de la Lista, debería serlist.subList(n, list.size()).clear();
Chaklader Asfak Arefe
1
Es una pena que tengas que crear un objeto solo para acortar una lista
David Bradley
1
@DavidBradley Es cierto, pero HotSpot en realidad puede optimizar esto
Stefan Reich
8

subList, como se sugiere en las otras respuestas, es lo primero que me viene a la mente. También sugeriría un enfoque de flujo .

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.
fuente