IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Supprimer efficacement plusieurs entrées dans une ArrayList


Sujet :

Collection et Stream Java

  1. #1
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut Supprimer efficacement plusieurs entrées dans une ArrayList
    Bonjour,
    je me demandais qu'elle était la manière la plus efficace de parcourir une ArrayList pour en supprimer plusieurs données. Sachant que la taille de la liste change quand on supprime une entrée en général je fais quelque chose de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ArrayList lines = new ArrayList();
    lines.add(1);lines.add(5);lines.add(0);lines.add(6);lines.add(12);
    lines.add(0);lines.add(1);lines.add(9);lines.add(0);lines.add(9);
    int c = lines.size();
    for (int i = 0; i < c; i++) {
    	if(lines.get(i) == 0)	{
    		lines.remove(i);
    		c = this.lines.size();
    		i = 0;
    	}
    }
    Dans cet exemple, je veux supprimer toutes les entrées égales à 0.
    Est-ce qu'il s'agit d'une bonne méthode d'après vous ? Elle oblige à reparcourir plusieurs fois certains éléments mais je ne vois pas trop d'autres méthodes.
    Merci d'avance
    Vive les roues en pierre

  2. #2
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    peut-être à l'envers ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (int i = lines.size(); i > -1; i--) {
    	if(lines.get(i) == 0)	{
    		lines.remove(i);
    	}
    }

  3. #3
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Arf mais oui effectivement
    Merci de me sortir de ma bouletitude ^^
    Vive les roues en pierre

  4. #4
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    Bonjour,
    je me demandais qu'elle était la manière la plus efficace de parcourir une ArrayList pour en supprimer plusieurs données. Sachant que la taille de la liste change quand on supprime une entrée en général je fais quelque chose de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ArrayList lines = new ArrayList();
    lines.add(1);lines.add(5);lines.add(0);lines.add(6);lines.add(12);
    lines.add(0);lines.add(1);lines.add(9);lines.add(0);lines.add(9);
    int c = lines.size();
    for (int i = 0; i < c; i++) {
    	if(lines.get(i) == 0)	{
    		lines.remove(i);
    		c = this.lines.size();
    		i = 0;
    	}
    }
    Dans cet exemple, je veux supprimer toutes les entrées égales à 0.
    Est-ce qu'il s'agit d'une bonne méthode d'après vous ? Elle oblige à reparcourir plusieurs fois certains éléments mais je ne vois pas trop d'autres méthodes.
    Merci d'avance
    A mon sens mieux veut utiliser un iterateur :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (Iterator<Integer> it = lines.iterator();it.hasNext();) {
    	if(it.next() == 0)	{
    		it.remove();
     
    	}
    }

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  5. #5
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par Deadpool Voir le message
    A mon sens mieux veut utiliser un iterateur :
    je me suis posé la question et j'ai regardé le code source: on n'y gagne rien (si ce n'est en lisibilité): heureusement que les arraycopy sont efficaces car on en fait un à chaque suppression.
    Mais cette question m'a amené en m'en poser une autre:
    soit un cas très général dans lequel l'appel d'une méthode "m" se décompose en trois phase : "debut", "action", "fin".
    comment mettre en place un mécanisme qui permette de faire un truc élégant quand on regroupe plusieurs appels de "m" (donc "debut", "action1, "action2", "action3",... "fin").
    Bien sûr des solutions triviales nous viennent à l'esprit mais en fait c'est pas si trivial que ça.
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par professeur shadoko Voir le message
    je me suis posé la question et j'ai regardé le code source: on n'y gagne rien (si ce n'est en lisibilité):
    Ben c'est l'objectif justement !!! En plus cela propose le meilleur compromis de performance...

    Citation Envoyé par professeur shadoko Voir le message
    heureusement que les arraycopy sont efficaces car on en fait un à chaque suppression.
    Ca c'est un autre problème. Dans ce cas précis je critiquerait le choix d'un ArrayList, qui n'est pas très adapté à la suppression de données "au milieu".

    S'il faut faire cela plusieurs fois, une LinkedList serait peut-être plus approprié...


    Citation Envoyé par professeur shadoko Voir le message
    Mais cette question m'a amené en m'en poser une autre:
    soit un cas très général dans lequel l'appel d'une méthode "m" se décompose en trois phase : "debut", "action", "fin".
    comment mettre en place un mécanisme qui permette de faire un truc élégant quand on regroupe plusieurs appels de "m" (donc "debut", "action1, "action2", "action3",... "fin").
    Bien sûr des solutions triviales nous viennent à l'esprit mais en fait c'est pas si trivial que ça.
    Je n'ai pas trop compris ce que que veux faire en fait

    a++

  7. #7
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Merci pour les retours
    En fait je cherchais la méthode la plus efficace dans le sens vitesse/ressources et je crois qu'un itérateur sera toujours moins rapide qu'un parcours à l'envers.

    Pour le code pourri du début, dans un prog je devais parcourir une ArrayList et exécuter des méthodes de chaque objet de la liste dans l'ordre des items et en supprimer certains, du coup je ne me suis jamais trop reposé la question jusqu'à maintenant. En revanche, si y a de la copie de tableau à gogo, c'est clair qu'il faut peut-être que je revois ce prog, merci pour l'info

    Dans ce prog, sur une liste de 400-4000 items, il peut y avoir de l'ordre de 200-400 créations/suppressions d'entrées dans la liste tous les cycles.

    Sachant que la liste complète doit être parcourue à chaque cycle, je vais regarder les complexités (parcours-suppression-ajout) mais ça peut être intéressant de coller une LinkedList (jamais utilisée en Java mais je crois qu'en général les temps de parcours sont pas terribles comparés à un vecteur, d'un autre côté je ne me souviens plus comment fonctionne l'ArrayList, un tour dans les sources ne fait jamais de mal )
    Vive les roues en pierre

Discussions similaires

  1. conflit entre plusieurs scripts dans une même page
    Par lebenou13 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 11/11/2009, 15h17
  2. Ajouter plusieurs entrées dans une table
    Par flab78 dans le forum Débuter
    Réponses: 2
    Dernier message: 25/04/2008, 15h17
  3. Supprimer des entrées dans une table
    Par gpanpan dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 23/03/2008, 18h22
  4. Supprimer plusieurs elements d'une arraylist
    Par metalcoyote dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 25/01/2007, 14h14
  5. [Collections]Supprimer des doublons dans une ArrayList
    Par emie31 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/12/2005, 15h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo