Vector en java

Résolu/Fermé
amal-these Messages postés 25 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 28 mai 2016 - 24 avril 2016 à 19:35
amal-these Messages postés 25 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 28 mai 2016 - 28 avril 2016 à 12:04
Bonjour,

J'ai deux variables :
1. Vector <Vector<double[]>> E = new Vector <Vector<double[]>>();
2. Vector <double[]> B = new Vector <double[]>();

pour remplir le premier (E) je remplis le deuxième (B) pour utiliser cette instruction : E.add(B);

j'utilise B car je peux pas remplir E directement.

Mon problème est le suivant : lorsque je vide B ou je lui affecte autre valeurs, automatiquement E connait les mm changement.

je vous remercie infiniment d'avance.
A voir également:

1 réponse

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
24 avril 2016 à 19:40
Après l'ajout, réinstancies B avec un nouveau "new" pour générer un nouvel objet.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
24 avril 2016 à 20:07
En effet, c'est la base du système de référence des objets.
B est une référence, l'objet que tu mets dans E est une référence, mais l'objet qu'il y a derrière ces deux références c'est le même, donc la modification de l'objet impacte forcément les deux références.
Il faut donc créer des objets distincts pour éviter les effets de bords.

Remarques :
  • L'usage de Vector est déconseillé, utilises une ArrayList à la place. Voir la JavaDoc de Vector : "(...) it is recommended to use ArrayList in place of Vector"
  • Il est également déconseillé de mélanger les collections (Vector, List, etc.) et les tableaux, puisque les Vector sont déjà des tableaux, pourquoi faire des
    Vector<double[]>
    quand on peut faire un
    Vector<Vector<Double>>
    ...
  • Lors du new il n'est pas nécessaire de rappeler le type de données entre < > ce qui simplifie un peu le code :
    Vector<Vector<double[]>> E = new Vector<>();
0
amal-these Messages postés 25 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 28 mai 2016
24 avril 2016 à 20:11
Merci infiniment pour votre réponse ça marche très bien.
Suite à votre réponse j'ai deux questions si vous me permettez :
1. Qu'elle est la cause de ce problème?
2. Si je veux conserver le B je peux pas le ré instancier ?

Merci
0
amal-these Messages postés 25 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 28 mai 2016
24 avril 2016 à 20:28
Je vous remercie infiniment pour ces remarques pertinentes.

S'il vous plait je veux savoir comment je peux initialiser le E de type : Vector<Vector<Double>>, si je passe pas par B et le tableau?

Merci
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
24 avril 2016 à 20:32
Vu ton code plus haut, E ce sera plutôt Vector<Vector<Vector<Double>>> avec trois niveaux comme tu en avais 3 avec Vector<Vector<double[]>>
Même si je te conseilles plutôt d'avoir une List<List<List<Double>>> et de remplacer les Vector par des ArrayList.

Pour bien t'aider est-ce que tu pourrais nous donner un peu plus de code, pour voir comment tu fais actuellement pour remplir ton tableau E avec B ?
0
amal-these Messages postés 25 Date d'inscription mercredi 3 juin 2015 Statut Membre Dernière intervention 28 mai 2016 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
27 avril 2016 à 00:54
merci infiniment pour votre aide.
alors mes données sont stockées dans une matrice A car je lis à partir d'un fichier:
double[][] A= {{1,2,0.3,0.1},
{3,4,1,0.7},
{5,6,0.1,0.2},
{1.5,2.3,0.3,0.1},
{0.5,0.3,0.3,0.1},
{0.5,0.6,0.1,0.2},
{5.1,6,0.2,0.2},
{0.9,0.4,0.7,0.2},
{2.4,3.5,1,0.7},
{3.1,4,1.2,1.8},
{3.1,4,1.2,1.7},
{3.1,4,1.2,1.9},
{3.1,4,1.2,0.8},
{3.2,4.1,1.2,0.8},
{3,5,1.2,0.8}
};
chaque ligne de A représente une donnée.
Je travaille sur la classification alors j'ai codé la partition par une variable E de type Vector <Vector<double[]>> : double[] contient une donnée de A c'est pour cela que j'ai travaillé avec un tableau. Vector<double[]> représente une classe qui est un ensemble de données de A. et Vector <Vector<double[]>> c'est un ensemble de classe.
Alors j'ai pensé comme ça pour programmé une partition qui prend les données d'une matrice.

Si vous voyez autre façon pour les types, merci de me les décrire.

Construction de E :
puisque E.elementAt(0) n'existe pas encore mm si j'ai instancié E, je déclare B de type : Vector<double[]> je la remplie par B.add(A[i]) et puis E.add(B).

j'espère que j'ai bien expliqué. Je vous remercie beaucouuuup pour votre aide.
0