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

Java Discussion :

Copier Vecteur dans un Vecteur


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Par défaut Copier Vecteur dans un Vecteur
    Bonjour,
    Mon code est le suivant:
    Code java : 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
    23
    24
     
     
    import java.util.Collections;
    import java.util.Vector;
     
    public class CopyElementsOfVectorToVectorExample {
     
      public static void main(String[] args) {
     
        //create first Vector object
        Vector v1 = new Vector();
     
        //Add elements to Vector
        v1.add("1");
        v1.add("2");
        v1.add("3");
     
        //create another Vector object
        Vector v2 = new Vector();  
     
        Collections.copy(v2,v1);
     
        System.out.println("After copy, Second Vector Contains : " + v2);  
      }}

    Mais j'ai eu l'erreur suivante:
    Exception in thread "main" java.lang.IndexOutOfBoundsException: Source does not fit in dest
    at java.util.Collections.copy(Collections.java:548)
    at CopyElementsOfVectorToVectorExample.main(CopyElementsOfVectorToVectorExample.java:20)
    Avez-vous une idée ?
    Merci.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    Bonjour,

    Ton erreur est précisée dans la javadoc:
    The destination list must be at least as long as the source list.
    ...
    IndexOutOfBoundsException - if the destination list is too small to contain the entire source List.
    Initialiser la capacité du vecteur au départ.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vector v2 = new Vector(v1.size());
    Ou utiliser addAll de vector qui doit modifier la taille.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Vector v2 = new Vector();  
    v2.addAll(v1);

  3. #3
    Membre éclairé Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Par défaut
    Merci
    J'ai utilisé la deuxième solution :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Vector v2 = new Vector();  
    v2.addAll(v1);

  4. #4
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Attention, tu ne fais absolument pas la même chose entre ces 2 codes.

    Dans le premier cas, tu copies les éléments dans un autre tableau, faisant de fait ce second tableau la copie du premier. Un changement d'un élément n'impacte qu'un tableau.

    Dans le second cas, tu ajoutes tout les éléments du premier tableau au second. Un changement sur un élément impacte donc les 2 tableaux.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  5. #5
    Membre éclairé Avatar de chercheur111
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    352
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 352
    Par défaut
    Oui, tout à fait.
    Après la copie, j'ai modifié le premier vecteur et j'ai remarqué que les deux vecteurs ont été modifié ...

    Mon objectif est de garder la copie intact même si je modifie le vecteur source..
    J'ai modifié le code comme suit :
    Code java : 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
    23
    24
    25
    26
     
    import java.util.Collections;
    import java.util.Vector;
     
    public class CopyElementsOfVectorToVectorExample {
     
      public static void main(String[] args) {
     
        //create first Vector object
        Vector v1 = new Vector();
     
        //Add elements to Vector
        v1.add("1");
        v1.add("2");
        v1.add("3");
     
        //create another Vector object
        Vector v2 = new Vector(v1.size());  
     
     
       Collections.copy(v2,v1);
     
     
     
        System.out.println("After copy, Second Vector Contains : " + v2);  
      }}
    L'erreur persiste:
    Exception in thread "main" java.lang.IndexOutOfBoundsException: Source does not fit in dest
    at java.util.Collections.copy(Collections.java:548)
    at CopyElementsOfVectorToVectorExample.main(CopyElementsOfVectorToVectorExample.java:21)
    Merci pour l'aide.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Hizin Voir le message
    Attention, tu ne fais absolument pas la même chose entre ces 2 codes.
    Euh, non. La différence est minime.
    Collections.copy() assure qu'elle n'essaiera pas de modifier la taille de la liste destination, ce qui lui permet d'être toujours en temps linéaire.
    addAll() modifie toujours la taille de la liste destination, puisqu'elle ne fait qu'ajouter des éléments. Il y a de nombreux cas où elle ne sera pas linéaire (bien que la différence ne soit pas énorme avec les List standard.)

    Fondamentalement, Collections.copy() est bien pour remplacer le contenu d'une List. Si on a besoin de le faire souvent, c'est bien plus efficace que d'effacer d'abord et insérer ensuite.

    En dehors de ça c'est pareil. Dans les deux cas si tu changes un élément de l'une, ça change l'élément de l'autre.


    Citation Envoyé par chercheur111 Voir le message
    Oui, tout à fait.
    Après la copie, j'ai modifié le premier vecteur et j'ai remarqué que les deux vecteurs ont été modifié ...
    Ça fera pareil avec Collections.copy().

    Si tu ne veux pas ça, tu dois copier tous les éléments à la main.

    Par exemple, si ce sont des Calendar :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(Calendar cal : list1) {
      Calendar copy = cal.clone();
      list2.add(copy);
    }
    Note : de nos jours les Vectors sont obsolètes, on préfèrera utiliser ArrayList qui évite le coût de la synchronisation.
    Tu devrais vérifier si tu as vraiment besoin de Vector avec sa synchronisation.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/08/2011, 14h15
  2. Réponses: 4
    Dernier message: 19/05/2005, 14h18
  3. Mettre un objet utilisant COM dans un vecteur
    Par 0xYg3n3 dans le forum MFC
    Réponses: 7
    Dernier message: 18/04/2005, 15h50
  4. donée de plusieur vecteur dans une structure ??
    Par lipczynski dans le forum C++
    Réponses: 5
    Dernier message: 13/08/2004, 08h17

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