Truncar uma lista para um determinado número de elementos

120

Que método trunca uma lista - por exemplo, para os 100 primeiros elementos - descartando os outros (sem iterar através de elementos individuais)?

Sam
fonte

Respostas:

141

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

Você deve ter em mente que subListretorna uma exibição dos itens; portanto, se você deseja que o restante da lista seja elegível para coleta de lixo, copie os itens que deseja para um novo List:

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

Se a lista for menor que o tamanho especificado, espere uma exceção fora dos limites . Escolha o valor mínimo do tamanho desejado e o tamanho atual da lista como o índice final.

Por fim, observe que o segundo argumento deve ser um a mais que o último índice desejado.

Ben Lings
fonte
1
Embora a pergunta não seja exatamente clara, parece que o sam deseja excluir o final da lista. Portanto, sua resposta deve incluir um list.clear ().
mP.
Não é provável que tenha um desempenho tão bom quanto a solução de karim79, que é a melhor alternativa - ela tem as melhores chances de ter um bom desempenho e também é o código mais limpo.
Lawrence Dol
Eu acho que depende do número de elementos a serem removidos (e também se a modificação Lista suportes)
Ben Lings
1
Se o Java 8 for uma opção, acho que Stream.limitdeveria fazer o truque ( docs.oracle.com/javase/8/docs/api/java/util/stream/… )
Eran Medan
53
list.subList(100, list.size()).clear();

ou:

list.subList(0, 100);
karim79
fonte
3
A primeira opção modifica a lista, enquanto a segunda não. Deve serlist = list.subList(0, 100)
nessa.gp 04/04
3
Observe também que subList(100, list.size()).clear()só funcionará se a lista tiver seu método clear implementado, por exemplo, se você criar listpor List<String> list = Arrays.asList(someString.split(","));clear () será lançado, UnsupportedOperationExceptionpois listserá um resumo List.
Gyuri 14/10
Se você gostaria de manter os n elementos da lista inicial, deve serlist.subList(n, list.size()).clear();
Chaklader Asfak Arefe
1
É uma pena que você tenha que criar um objeto apenas para encurtar uma lista
David Bradley
1
@DavidBradley verdade, mas HotSpot pode realmente otimizar essa distância
Stefan Reich
8

subList, como sugerido nas outras respostas, é o primeiro que vem à mente. Eu também sugeriria uma abordagem de fluxo .

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