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 :

[Collections] Fonctionnement des Vector [Débutant(e)]


Sujet :

Collection et Stream Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 43
    Points : 25
    Points
    25
    Par défaut [Collections] Fonctionnement des Vector
    Salut

    Je me demande comment fonctionne un vecteur quand on lui supprime un element.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(int i = 0; i < mon_vecteur.size(); i++)
    		mon_vecteur.removeElementAt(i);
    Est ce que apres une suppression le vecteur se reorganise automatiquement ou laisse t'il des trous ?
    Est ce que le mon_vecteur.size() va changer et donc raccourcir la boucle.
    Si jamais le Vecteur se reorganise (c'est a dire qu'on vient de supprimer elementAt(3) est ce qu'un element elementAt(3) different apparais ou elementAt(3) devient vide) je ne risque pas de sauter un element ?

  2. #2
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    CA VA PETER !!!!!!!!!!!!!!!!!!!!!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(int i = 0; i < mon_vecteur.size(); i++)
          mon_vecteur.removeElementAt(0);
    et oui si tu supprime l'element un, le deux devient le un...

    et pour ton i = size() tu sera dans un espace memoire qui n'existe plus...

  3. #3
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    De mémoire, il ne vaut mieux pas faire ce genre de chose dans une boucle qui boucle justement sur ce vector. Tu risques d'avoir des surprises.
    Si tu dois le faire, stocke plutot les indices des elements à enlever et fait le après la boucle.

  4. #4
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    C'est vrai que tu vas avoir un NullPointerException. Voici un exemple :

    un vecteur de 5 éléments

    0 - élément un
    1 - élement deux
    2 - élément trois
    3 - élément quatre
    4 - élément cinq

    premiere itération : i = 0

    on supprime ce qui est en position 0, le reste est décalé

    0 - élément deux
    1 - élement trois
    2 - élément quatre
    3 - élément cinq
    4 - null

    deuxième itération : i = 1

    on supprime ce qui est en position 1, le reste est décalé

    0 - élément deux
    1 - élement quatre
    2 - élément cinq
    3 - null
    4 - null

    troisième itération : i = 2

    on supprime ce qui est en position 2, le reste est décalé

    0 - élément deux
    1 - élement quatre
    2 - null
    3 - null
    4 - null

    troisième itération : i = 3

    Tu essaie de supprimer un élément null, ca pete

    Tu peut employer la méthode clear() pour vider un vecteur

    P.S. Il est deconseillé d'employer le type vector

  5. #5
    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,


    On ne doit pas parcourir les collections de cette manière ! Afin éviter tout les problèmes relatifs à l'implémentation particulière d'une collection, on doit utiliser un Iterator pour parcourir les éléments...

    L'équivalent de ton code deviendrait donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(Iterator iter = mon_vecteur.iterator(); iter.hasNext(); ) {
    	Object value = iter.next();
    	iter.remove();
    }

    a++

  6. #6
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    En fait tu pourrais faire comme tu l'as fait, mais dans l'autre sens, en commencant par les éléments de la fin jusqu'à ceux du début

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    Merci pour toute ces reponses interessantes.
    Malheuresement je m'en doutait un peu .

    La solution des iterator a l'air interessante, si j'ai bien compris elle s'emploi avec mon vecteur et ne le modifie en rien a part le remove qui enleve l'element choisi sans que cela ne pose de probleme et me rendant un vecteur utilisable a la fin ?

    Sinon witchounet me conseille de ne pas utiliser les vector mais ils me sont bien utiles.

    J'utilise des vecteur pour avoir une suite d'entier (j'utilise donc des Integer puisque les int sont pas des objets) ordonnées et non fixe et ca doit etre accessible le plus vite possible (pour ajout et suppression) grace a une fonction qui m'emmene directement sur la case a enleve/ajouter (pour le vecteur -> elementAt(i)).
    Le fait que le vecteur se reorganise automatiquement es aussi tres avantageux.
    Existe il quelque chose de mieux que les vecteur et tout aussi facile d'utilisation ? (mieux = +rapide).
    Le vecteur est il trop lent ?

  8. #8
    Membre actif Avatar de schneidb
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 236
    Points : 240
    Points
    240
    Par défaut
    S'il ne faut pas supprimer toujours en 0, j'ai défait qqch comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(int i = 0; i < v.size(); i++)
    {
       if ( elementAsupprimer )
       {
         mon_vecteur.removeElementAt(i);
         i--; 
       }
    }
    le fait que le vecteur se reorganise automatiquement es aussi tres avantageux.
    Existe il quelque chose de mieux que les vecteur et tout aussi facile d'utilisation ? (mieux = +rapide).
    Qu'on me corrige si je me trompe, mais je ne crois pas qu'il se réorganise en "translatant" les trous pour les comblés. Je dirais plutot qu'il supprime la réference et qu'il fonctionne comme une liste chainée.

  9. #9
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par Ubum
    Sinon witchounet me conseille de ne pas utiliser les vector mais ils me sont bien utiles.

    J'utilise des vecteur pour avoir une suite d'entier (j'utilise donc des Integer puisque les int sont pas des objets) ordonnées et non fixe et ca doit etre accessible le plus vite possible (pour ajout et suppression) grace a une fonction qui m'emmene directement sur la case a enleve/ajouter (pour le vecteur -> elementAt(i)).
    Le fait que le vecteur se reorganise automatiquement es aussi tres avantageux.
    Existe il quelque chose de mieux que les vecteur et tout aussi facile d'utilisation ? (mieux = +rapide).
    Le vecteur est il trop lent ?
    Tu peut tout à fait employer les ArrayList qui s'utilise quasimetn de la meme manières que les vectors

  10. #10
    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
    Citation Envoyé par Ubum
    Sinon witchounet me conseille de ne pas utiliser les vector mais ils me sont bien utiles.
    Les Vector ont été hérité de la première version de Java, mais avec Java 1.2 une véritable API de Collection a été intégré (voir l'interface List).

    La classe ArrayList correspond à Vector sauf qu'elle n'est pas synchronisé. Elle est donc potentiellement plus rapide...

    Elle est également plus simple d'utilisation car elle respectent totalement l'API de Collection, alors que la classe Vector (qui respecte aussi cette API) se retrouve avec des méthode identique mais avec des noms différents (afin de respecter les noms initials). Par exemple get() et elementAt() sont identique...




    schneidb >> Le problème reste le même : il ne faut pas modifier une collection dans une tel boucle. Les Iterator sont fait pour cela...

    Selon l'implémentation de ta List, cela peut être désastreux en temps d'exécution (sur une LinkedList par exemple), alors que l'Iterator gère tout ca...

    a++

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    OK, j'ai lu rapidement la javadoc malgré mon anglais boiteux et si j'ai bien compris le ArrayList me convient tout a fait, de plus le Iterator marche dessus aussi.
    Je suppose que comme il s'agit d'une liste, le ArrayList se "reforme" automatiquement et qu'il n'ya donc pas de trous dans le tableau.

    Je m'en vais de ce pas tout remplacer par des ArrayList.
    Merci pour tout donc.

  12. #12
    Membre confirmé Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Points : 508
    Points
    508
    Par défaut
    juste une petite idée en passant ... enfin ... chacun son code hein !?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monVector.removeAllElements();
    ça t'irait pas ?

    je sais ... jme prend la tête

    [EDIT] autant pour moi ... la prochaine fois je lirais tous les post jusqu'au bout ...
    mais on t'as donné ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for(int i = 0; i < v.size(); i++) 
    { 
       if ( elementAsupprimer ) 
       { 
         mon_vecteur.removeElementAt(i); 
         i--; 
       } 
    }
    et moi j'aurais tendance à noter ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int i=0;
    while(i < v.size()) 
    { 
       if ( elementAsupprimer ) 
       { 
         mon_vecteur.removeElementAt(i); 
       } 
        else i++;
    }

    mais encore une fois .. chacun son code ...

  13. #13
    Membre confirmé Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Points : 570
    Points
    570
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(int i = 0; i < v.size(); i++)
    {
       if ( elementAsupprimer )
       {
         mon_vecteur.removeElementAt(i);
         i--;
       }
    }
    Ca doit marcher mais qu'est ce que c'est laid !!!, Si on veut rester dans une boucle for, il faut mieux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(int i = v.size()-1 ; i > -1 ; i--)
    {
       if ( elementAsupprimer )
       {
         mon_vecteur.removeElementAt(i);
       }
    }
    changer de valeur le i comme ca en plein milieu du code, ca rends un programme extrement difficile a debuguer !

  14. #14
    Membre confirmé Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Points : 508
    Points
    508
    Par défaut
    mmm .. tu as dit .. il me semble .. que tu stoquais des Integer ...

    J'aimerai que tu réfléchisses à cela : si tu récupère la liste des Integer à enlever (c'est une simple supposition, je ne connais pas ton code), cette liste est forcément plus courte que ton Vector ... tu est toujours d'accord ?

    Ainsi, tu pourrais avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Integer[] removeList = //récupération des Integer à enlever
     
    for(int i=0 ; i<removeList.length ; i++)
       //on fait ici l'hypothèse qu'il n'y a pas plusieurs occurence du même entier à enlever
       monVector.removeElement(removeList[i]);
    et voilou .. pas top ça ? ^^. Le parcours prend forcément moins d'itérations.

    Encore faut-il que tu récupère la liste des entiers à enlever .... je ne connais pas ton code ^^.

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    NeptuS> Oui je pourrais faire ca (et ca reglerai un probleme d'ailleurs) mais je doit parcourir mon vecteur une fois pour savoir quels elements je doit supprimer donc je prefere les supprimer au fur et a mesure pour ne pas avoir a recreer une boucle qui serait exactement la meme en dessous.

Discussions similaires

  1. [Tableaux][Collections]Concaténer des tableaux
    Par elitost dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 15/11/2005, 14h49
  2. Fonctionnement des WeakHashMap
    Par seiryujay dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 03/10/2005, 14h12
  3. Fonctionnement des fichiers.
    Par phoenix440 dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 29/05/2005, 15h36
  4. [Collections] Conversion de Vector en tableau de String
    Par java_math dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 06/06/2004, 12h55
  5. [langage] fonctionnement des Processus
    Par GMI3 dans le forum Langage
    Réponses: 3
    Dernier message: 19/09/2003, 11h12

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