Update d'une ArrayList

Résolu
cs_asgarden Messages postés 11 Date d'inscription mardi 18 avril 2006 Statut Membre Dernière intervention 26 mai 2006 - 11 mai 2006 à 11:44
MrEske Messages postés 8 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 5 mars 2008 - 10 janv. 2008 à 17:17
Bonjour à tous,

voilà j'aimerai savoir comment faire une mise à jour (update) d'une ArrayList ?

Lorsque je récupère un objet de cette ArrayList (via son index, ou par exemple en utilisant un Iterator), est-ce que je récupère l'objet lui même, ou seulement une référence à cet objet ? Objet lui-même il me semble mais je n'en suis pas certain...

Si je récupère l'objet lui-même j'ai besoin, après modification de cet objet, de le restocker dans la liste, et c'est là que j'ai de gros doutes... Dois-je l'ancien objet et ajouter le nouvel objet modifier ? Est-ce qu'un simple ArrayList.set(object_index) permet de faire la mise à jour ?
J'attend vos réponses, merci :)

A l'heure actuelle j'utilise cette méthode, mais je ne suis pas certains que cela fonctionne bien...

ArrayList list = methode_renvoyant_une_liste();
Iterator i_list = list.iterator();
MonObjet objet = null;
int i = 0; // Je m'en sers pour stocker l'index, mais je ne suis pas sur de mon coup...

while (i_list.hasNext()){
objet = (MonObjet) i_list.next();
// Récupère un objet de la liste
i++; // Incrémente l'index
objet.change_propriete();
// Change certaines propriétés de l'objet
list.set(i, objet); // Restock l'objet modifie à sa place...
}

Merci de votre aide,
Cordialement,
Cedric.
A voir également:

12 réponses

super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
11 mai 2006 à 12:07
si tu change l objet il sera changé directement dans ta arraylist sans que t ai d update à faire.
3
super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
11 mai 2006 à 12:08
voila le code que tu peux faArrayList list = methode_renvoyant_une_liste();


Iterator i_list = list.iterator();
MonObjet objet = null;

while (i_list.hasNext()){
objet = (MonObjet) i_list.next(); // Récupère un objet de la liste
objet.change_propriete(); // Change certaines propriétés de l'objet
}
3
cs_asgarden Messages postés 11 Date d'inscription mardi 18 avril 2006 Statut Membre Dernière intervention 26 mai 2006 1
11 mai 2006 à 12:14
Mille mercis Super Toinou !

Effectivement, je me cassais la tête pour pas grand chose...

De toute façon les deux autres méthodes que j'envisageais ne passaient pas...
Il n'est pas possible de modifier la structure d'une ArrayList durant un balayage via un Iterator...(ConcurrentModificationException).

En tout cas merci beaucoup pour cette réponse (rapide !).

A bientot,
Cordialement,
Cedric.
3
super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
11 mai 2006 à 15:35
ouai pour les itérateurs c'est pas possibles d'ajouter ou de supprimer (par contre modif je suis quasi sur que ca passe) parce que tu casse la chaine sur laquelle l'intérateur saute pour aller d indice en indice (les adresses de tes objets).
Pour ca si t utilise une liste tu peux faire un get(i) , un add(i) ou un delete(i) et ca plante pas, fo juste penser à bouger ton compteur en mm. (c moins rapide que les itérateurs puisque ca reparcourt tte la liste a chaque fois mais au moins ca plante pas)
++ Toinou
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MrEske Messages postés 8 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 5 mars 2008
9 janv. 2008 à 14:42
Bonjour,

Depuis hier que je passe tout mon temps sur un bug similaire mais sans le résoudre alors si vous pouvez me donner un coup de main...

Voici le code qui plante:
int

x= m.getX();

int y = m.getY();

float

[] posfl=
null ;

for (Iterator<
float[]> it =MonHashMap.keySet().iterator(); it.hasNext();){
               posfl= it.next();

               if ( (posfl[0] == x/40) && (posfl[1]==(y)/40) ){                                 System.

out .println(
"ok2");

                  break ;                   }

}

aucun problème pour les X, Y et mon HashMap mais justement droit à la fameuse (et énervante) exception

ConcurrentModificationExceptionà cause de la ligne :         posfl =it.next();

et je ne vois vraiment pas quoi faire... j'arrive pas à convertir mon Set en liste de float[] pour utiliser un ListIterator, une simple boucle for sur le keySet() me retourne la même exception...

Au secour ! comme qui dirait...

Ah, au fait je suis sur Eclipse si ça change quelque chose...
0
super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
9 janv. 2008 à 15:33
Hello,

tu peux envoyer un main complet avec tes map préremplies etc ... qui te rends la meme exception stp ?

++ Toinou
0
super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
9 janv. 2008 à 15:44
import




java.util.HashMap;



import




java.util.Iterator;



import




java.util.Map;



import




java.util.Random;




public








class

Main {



public





static





void

main(String[] args) {



for

(


int

i=0;i<100;i++){System.



out

.println(


new

Random().nextInt(2));}

Map<



float

[], String> map =


new

HashMap<


float

[],String>();map.put(



new





float

[]{0,3},

"tata"
);map.put(



new





float

[]{1,5},

"titi"
);



float

[] tab ;



for

(Iterator<


float

[]> it = map.keySet().iterator(); it.hasNext();) {

tab = it.next();

System.



out

.println(map.get(tab));



if

(tab[0] ==


new

Random().nextInt(2)) {System.



out

.println(

"trouvé : "
+ map.get(tab));



break

;}

}

}

}
0
super_toinou Messages postés 764 Date d'inscription mardi 25 mai 2004 Statut Membre Dernière intervention 8 mars 2011 6
9 janv. 2008 à 15:45
arf j ai oublié le début !!
Je disait que ca marchait ton code !
et que j ai utilisé cette classe pour tester !
T es sur que t as pas un thread qui modifie ta map en parallèle ??

++ Toinou
0
MrEske Messages postés 8 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 5 mars 2008
9 janv. 2008 à 20:05
Ben disons que en fait ça fait partie d'un programme avec une vingtaine de classes donc pour envoyer le main ça va être dur, mais j'ai effectivement plusieurs threads qui modifient mon hashmap en parallèle, ça peut venir de là? Parce qu'au début c'est ce que j'ai cherché puis en cherchant cette exception sur le net tout le monde disait que c'était à cause de HashMap.

Bon, je vais voir ce que ça donne en synchronisant tout ça...Merci du conseil.

5 mins plus tard:

Bon alors en fait j'ai carrément synchronisé toute la méthode dans laquelle est ce bout de code et la voici:

public

synchronized
void mouseClicked(MouseEvent m){System.

out.println(
"ok0");

if(m.getButton()= =MouseEvent.
BUTTON1 ){System.

out.println(
"ok1");

int x = m.getX();

int y = m.getY();System.

out .println((x/40)+
" "+((y)/40));

float [] posfl =
null;

for (Iterator<
float[]> it= Affichage. getCarteEcran ().keySet().iterator(); it.hasNext();){

posfl =it.next();

if ( (posfl[0] = = x/40) && (posfl[1]==(y)/40) ){System.

out .println(
"ok2");

break ;}

}

System.

out.println(
"posfl: "+posfl[0]+
" "+posfl[1]);

double[] coords ={0,0};

for(Iterator<
double []> it1= Jeu. getListeZones ().keySet().iterator(); it1.hasNext(); ){coords =it1.next();

if ( (coords[0] = = Affichage. getCarteEcran ().get(posfl)[0]) && (coords[1] == Affichage. getCarteEcran ().get(posfl)[1])){

System.

out.println(
"ok3");}

}

double [] pos ={0,0};

for(Iterator<
double []> it2= Jeu. getListeZones ().get(coords).getCarte().keySet().iterator(); it2.hasNext(); ){pos =it2.next();

if ( (pos[0] = =Affichage. getCarteEcran ().get(posfl)[8]) && (pos[1] == Affichage. getCarteEcran ().get(posfl)[9])){

System.

out.println(
"ok4");}

}

System.

out.println(
"coord: "+coords[0]+
" "+coords[1]);System.

out.println(
"pos: "+pos[0]+
" "+pos[1]);System.

out.println(Jeu.getListeZones().containsKey(coords));System.

out.println(Jeu.getListeZones().get(coords).getCarte().containsKey(pos));Jeu.getListeZones().get(coords).getCarte().get(pos)[6] =1;

System.

out.println(Jeu.getListeZones().get(coords).getCarte().get(pos)[6]);}

}

C'est un peu compliqué en fait pour les imbrications:
J'ai une classe Jeu qui contient un tableau de Zones (une zone dedans pour l'instant) avec un thread par Zone Hashmap<double[],zone> ListeZones
La classe Zone contient un tableau<double[],double[]> appelé Carte

En parallèle mon thread de Jeu lance une classe Ecran qui écoute ma souris et qui lance une classe Affichage avec un thread associé

Cette classe Affichage sert à afficher une carte à cheval sur les cartes des zones du dictionnaire de jeu et pour cela contient un dictionnaire HashMap<float[],double[]> CarteEcran

ce CarteEcran est pour ainsi dire réinitilaisé en permanence (pour rafraichir mon image), c'est à dire que je situe mon écran physique par rapport à toutes mes zones puis je lis leurs cartes pour les parties à afficher et je rempli ma carteEcran avec ça. Avant de remplir ma carte Ecran je prend évidemment soin de la vider.

Le problème vient peut-être du vidage... je vais voir ce que je peux faire pour ça...
0
MrEske Messages postés 8 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 5 mars 2008
9 janv. 2008 à 20:40
Et bien après avoir supprimé le vidage et mis un remove(pos) suivi d'un put(pos, carre) dans une méthode synchronized ça n'a rien changé...je suis désespéré...
0
MrEske Messages postés 8 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 5 mars 2008
10 janv. 2008 à 13:04
J'ai aussi testé le code de super_toinou qui marche sans problème donc ce n'est pas mon compilateur ou ma version d'éclipse...
0
MrEske Messages postés 8 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 5 mars 2008
10 janv. 2008 à 17:17
Bonne nouvelle, j'y ai mis du temps mais c'est effectivement à cause des threads, en fait le truc c'est de laisser les méthodes qui parcourent le keyset dans la classe qui crée le dictionnaire sinon ça plante.(genre rosier qui pique)!!! Merci du conseil à propos des threads.
0
Rejoignez-nous