126 votes

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

Quelle méthode permet de tronquer une liste - par exemple aux 100 premiers éléments - en écartant les autres (sans itérer sur les éléments individuels) ?

147voto

Ben Lings Points 11395

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 subList renvoie une vue des éléments, donc si vous voulez que le reste de la liste soit éligible à la collecte des déchets, vous devez copier les éléments que vous voulez dans un nouveau fichier de type 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 à un message hors limites. exception . Choisissez comme indice de fin la valeur minimale de la taille souhaitée et de la taille actuelle de la liste.

Enfin, notez que le deuxième argument doit être supérieur d'une unité au dernier indice souhaité.

1 votes

Bien que la question ne soit pas exactement claire, il semble que Sam veuille que la fin de la liste soit supprimée. Par conséquent, votre réponse devrait inclure un list.clear().

0 votes

Cette solution n'est pas susceptible de donner d'aussi bons résultats que celle de karim79, qui est la meilleure alternative - elle a les meilleures chances de donner de bons résultats et c'est aussi le code le plus propre.

0 votes

Je pense que cela dépend du nombre d'éléments à supprimer (et aussi si la liste supporte la modification).

56voto

karim79 Points 178055
list.subList(100, list.size()).clear();

ou :

list.subList(0, 100);

4 votes

La première option modifie la liste alors que la seconde ne le fait pas. Elle devrait être list = list.subList(0, 100)

3 votes

Notez également que subList(100, list.size()).clear() ne fonctionnera que si la liste a sa méthode claire implémentée, par exemple si vous créez list par List<String> list = Arrays.asList(someString.split(",")); clear() lancera UnsupportedOperationException depuis list sera un résumé List .

0 votes

Si vous souhaitez conserver les n éléments initiaux de la liste, il faut que ce soit list.subList(n, list.size()).clear();

17voto

Aomine Points 42709

subList comme suggéré dans les autres réponses, est le premier qui me vient à l'esprit. Je suggérerais également un approche fluviale .

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

4voto

tucuxi Points 5130

Vous n'avez pas précisé le type de liste. Si c'est une ArrayList, alors

list.removeRange(100, list.size());

a un coût de O(1).

D'autre part, s'il s'agit d'une LinkedList, alors removeRange nécessitera O(list.size()) appels, et donc clear() (il appelle removeRange()). Il ne semble pas y avoir de moyen O(1) de tronquer une liste chaînée en Java, sauf à écrire sa propre implémentation. Si la liste est courte, copier et perdre l'ancienne référence, comme le suggère Ben Lings, est le moyen le plus rapide d'obtenir ce que vous voulez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X