Tronquer une liste à un nombre donné d'éléments

120

Quelle méthode tronque une liste - par exemple aux 100 premiers éléments - en supprimant les autres (sans itérer à travers des éléments individuels)?

Sam
la source

Réponses:

141

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

Vous devez garder à l'esprit que subListrenvoie une vue des éléments, donc si vous souhaitez que le reste de la liste soit éligible pour le garbage collection, vous devez copier les éléments que vous souhaitez dans un nouveau List:

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

Si la liste est plus courte que la taille spécifiée, attendez-vous à une exception hors limites . Choisissez la valeur minimale de la taille souhaitée et la taille actuelle de la liste comme index de fin.

Enfin, notez que le deuxième argument doit être un de plus que le dernier index souhaité.

Ben Lings
la source
1
bien que la question ne soit pas tout à fait claire, il semble que sam veuille supprimer la fin de la liste. Par conséquent, votre réponse doit inclure une list.clear ().
mP.
Il est peu probable que cela fonctionne aussi bien que la solution de karim79, qui est la meilleure alternative - elle a les meilleures chances de bien fonctionner et est également le code le plus propre.
Lawrence Dol
Je pense que cela dépend du nombre d'éléments à supprimer (et aussi si la liste prend en charge la modification)
Ben Lings
1
Si Java 8 est une option, je pense que Stream.limitça devrait faire l'affaire ( 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
la source
3
La première option modifie la liste tandis que la seconde ne le fait pas. Il devrait êtrelist = list.subList(0, 100)
nessa.gp
3
Notez également que subList(100, list.size()).clear()cela ne fonctionnera que si list a sa méthode clear implémentée, par exemple si vous créez listpar List<String> list = Arrays.asList(someString.split(","));clear () lancera UnsupportedOperationExceptionpuisque listsera un résumé List.
Gyuri
Si vous souhaitez conserver les n éléments initiaux de la liste, ce devrait êtrelist.subList(n, list.size()).clear();
Chaklader Asfak Arefe
1
Dommage que vous deviez créer un objet juste pour raccourcir une liste
David Bradley
1
@DavidBradley Vrai mais HotSpot peut en fait optimiser cela
Stefan Reich
8

subList, comme suggéré dans les autres réponses, est la première qui me vient à l'esprit. Je suggérerais également une approche par flux .

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.
la source