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

Langage Java Discussion :

Utilisation de Vecteur de vecteurs ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut Utilisation de Vecteur de vecteurs ?
    Bonjour,

    Je cherche une solution (si elle existe) pour l'utilisation de Vecteur de Vecteurs. Pour commencer voici un exemple de code et j'expliquerai plus bas ce que je souhaite faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    Vector<Vector> listeVilles = new Vector<Vector> ();
    Vector<String> villes =  new Vector<String>();
    Vector<String> CodePostal = new Vector<String>();
    int i=0; j=0;
    String cp="";
     
    cp = "11111"; 
    villes.add(i++,"AAAA");
    villes.add(i++,"BBBB");
    villes.add(i++,"CCCC");
    CodePostal.add(j,cp);
    listeVilles.add(j++,villes); 
     
    i=0;
    villes.clear();
    cp = "22222"; 
    villes.add(i++,"DDDD");
    villes.add(i++,"EEEE");
    villes.add(i++,"FFFF");
    CodePostal.add(j,cp);  
    listeVilles.add(j++,villes);
    Pour chaque code postal je veux avoir le même index pour ce code, et également pour la liste des villes, villages ou lieux-dit associés à ce Code Postal. Toutes ces informations sont récupérées à partir d'une base de données.

    Bien sûr le code que j'ai écrit ci-dessus ne peux pas fonctionner car lorsque j'écris listeVilles.add(j++,villes); en fait c'est le pointeur vers "villes" que j'écris dans le vecteur listeVilles et comme le vecteur "villes" est vidé à chaque nouveau code postal, je ne retrouve donc pas la liste des villes associées à ce code.

    je pourrais créer une table de vecteurs mais vu le grand nombre de codes postaux, l’utilisation de la mémoire serait trop importante et aurait un impact significatif sur les performances.
    La seule solution convenable à laquelle j'ai aussi pensé serait de définir un seul string pour la liste des villes limitées par un séparateur.
    Mais l'idée de Vecteur de Vecteurs me plaisait bien car cela me permettait de remplir en une seule instruction une JComboBox (setModel(Vector) ).

    Qu'en pensez-vous ? Merci d'échanger vos idées.

    Gégé

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Déjà, pour avoit le même index, il suffit de ne l'incrémenter après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vector1.add( i, machin );
    vector2.add( i, truc);
    i++
    machin et truc sont mis au même index dans vector1 et vector2.

    Cependant, le plus simple est ne pas utiliser d'index dans ton cas (le but est d'ajouter à la fin).

    Ensuite, le plus simple et le plus fiable serait de n'utiliser qu'un seul vecteur, et un objet qui contient code postal et villes associées. Ainsi, plus de problème de "même index". Il suffit d'adapter le modèle. Et au passage de se débarrasser des Vector, qui est une classe obsolète.

    Au passage, 2 choses :

    • il y a un bug dans ton code. Comme tu recycles listeVilles, en faisant un clear à chaque fois que tu recréés un code postal, tu vas te retrouver avec tous les codes postaux associés à la liste des villes du dernier code postal ajouté ! Il faut recrer un vecteur de villes à chaque nouveau code postal
    • Vector<Vector<String> listeVilles serait mieux pour pouvoir récupérer les villes dans listevilles (sans avoir à caster) Vector<String> villes = listeVilles.get(index)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut
    Merci pour ta réponse rapide.
    Tu dis :"machin et truc sont mis au même index dans vector1 et vector2."
    Si tu regardes attentivement mon code, tu verras que c'est le cas (j'utilise la variable j) pour les vecteur CodePostaux et listeVilles, et non la variable i, qui ne sert qu'à incrémenter le vecteur villes.

    d'autre part du dis : <<Il y a un bug dans ton code. Comme tu recycles listeVilles, en faisant un clear à chaque fois que tu recréés un code postal, tu vas te retrouver avec tous les codes postaux associés à la liste des villes du dernier code postal ajouté ! Il faut recrer un vecteur de villes à chaque nouveau code postal>>

    C'est exactement ce que j'ai écrit :
    Bien sûr le code que j'ai écrit ci-dessus ne peux pas fonctionner car lorsque j'écris listeVilles.add(j++,villes); en fait c'est le pointeur vers "villes" que j'écris dans le vecteur listeVilles et comme le vecteur "villes" est vidé à chaque nouveau code postal, je ne retrouve donc pas la liste des villes associées à ce code.

    Concernant l'utilisation de Vector, je suis d'accord avec toi, dans la majorité des cas je devrais plutôt utiliser ArrayList,. Sans doute une mauvaise habitude !! Il y a toutefois un excellent article que tu connais sans doute, pour comparer ces deux classes http://www.javaworld.com/article/207...is-better.html

    Bien sûr je pourrais utiliser un seul vecteur, mais si j'en utilise deux, c'est parce que cela me permet de "populer" une JComboBox directement. Mais n'aurais-je pas le même problème si j'utilisais une classe ArrayListe à la place d'un Vecteur (sans doute oui !).

    La solution que j'ai trouvée et qui me permet de conserver l'architecture que je me suis imposée (sans doute à tort), c'est en modifiant légèrement le code de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
    Vector<String>  listeVilles = new Vector<String> ();
    Vector<String> CodePostal = new Vector<String>();
    int i=0; 
    String cp="";
    String villes ="";
     
    cp = "11111"; 
    villes  +=  "AAAA" + "$";  // $ est le séparateur
    villes  +=  "BBBB" + "$";
    villes  +=  "CCCC" + "$";
    CodePostal.add(i,cp);
    listeVilles.add(i++,villes); 
     
    villes ="";
    villes  +=  "DDDD" + "$";   
    villes  +=  "EEEE" + "$";
    villes  +=  "FFFF" + "$";
    cp = "22222"; 
    CodePostal.add(i,cp);  
    listeVilles.add(i++,villes);
    Bien sûr ceci est juste un exemple créé pour illustrer cette discussion (et non testé). En réalité, le vrai code est beaucoup plus complexe, avec des boites swing et des tables d'une base de données.

    Pour retrouver mes villes, il me suffit maintenant d'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String v = listeVille.elementAt(i);
     String[] tab = v.split("$");
    ......
    ....
    Merci encore toutefois pour ta réponse et tes conseils, c'est toujours de la discussion que jaillit la lumière.

    Gégé

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par GérardMartinelli Voir le message
    d'autre part du dis : <<Il y a un bug dans ton code. Comme tu recycles listeVilles, en faisant un clear à chaque fois que tu recréés un code postal, tu vas te retrouver avec tous les codes postaux associés à la liste des villes du dernier code postal ajouté ! Il faut recrer un vecteur de villes à chaque nouveau code postal>>

    C'est exactement ce que j'ai écrit :
    Non. Il ne faut pas faire villes.clear(), mais villes = new Vector<String>()
    Citation Envoyé par GérardMartinelli Voir le message
    ...en fait c'est le pointeur vers "villes" que j'écris dans le vecteur listeVille...
    La référence, et pas le pointeur, et, justement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    List<String> villes = new ArrayList<>();
    List<List<String>> listeVilles = new ArrayList<>();
     
    villes.add("1");
    villes.add("2");
    villes.add("3");
     
    listeVilles.add(villes);
     
    villes.clear();
    villes.add("4");
    villes.add("5");
    villes.add("6");
    listeVilles.add(villes);
     
    System.out.println(listeVilles);
    affiche [[4, 5, 6], [4, 5, 6]] et non pas [[1, 2, 3], [4, 5, 6]]


    Citation Envoyé par GérardMartinelli Voir le message
    Bien sûr je pourrais utiliser un seul vecteur, mais si j'en utilise deux, c'est parce que cela me permet de "populer" une JComboBox directement. Mais n'aurais-je pas le même problème si j'utilisais une classe ArrayListe à la place d'un Vecteur (sans doute oui !).
    A un moment donné, lorsqu'une application atteint un certain niveau de complexité et de métier, c'est quand même mieux de travailler avec un modèle métier, plutôt que de tout gérer avec des Vector/List/Map de Vector/List/Map, ou des bidouilles avec des concaténations de chaines et des split().

    On peut très bien faire JComboBox<Ville>(communes.get(codePostal).getVilles()) pour peupler une combo.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Par défaut
    Non. Il ne faut pas faire villes.clear(), mais villes = new Vector<String>()
    C'était exactement cela mon erreur et la solution que je cherchais. De toutes façons, je vais suivre tes conseils sur la façon de coder dorénavant.

    Merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Vecteur de vecteur de vecteur ?
    Par oodini dans le forum C++
    Réponses: 22
    Dernier message: 03/10/2011, 14h12
  2. Réponses: 4
    Dernier message: 24/09/2010, 01h13
  3. Vecteurs de vecteurs de vecteurs
    Par El Charpi dans le forum C++
    Réponses: 4
    Dernier message: 11/01/2010, 22h29
  4. Quelle commande utiliser pour écrire des vecteurs en colonne ?
    Par minimel dans le forum Mathématiques - Sciences
    Réponses: 2
    Dernier message: 18/05/2007, 19h24
  5. Mettre un objet utilisant COM dans un vecteur
    Par 0xYg3n3 dans le forum MFC
    Réponses: 7
    Dernier message: 18/04/2005, 16h50

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