Probleme avec un Vector (élément écrasé lors du .add() )

Probleme avec un Vector (élément écrasé lors du .add() ) - Java - Programmation

Marsh Posté le 21-04-2005 à 13:16:25    

Bonjour,  
J'ai un problème lors de l'utilisation d'un Vector
Je m'en sers pour adder des listes de coordonnées (des Vector également).
Le probleme, c'est que qd j'add un nouveau Vector, toute les instances contenue dans la Liste contenant tout les autres Vector sont écrasé
 
 
ex:
v == null
 
j'ajoute le premier élément :  
v == [{0,0}, {1,1}, {2,2}]  
 
j'ajoute la liste ; [{10,10},{9,9},{8,8}]
 
Mon Vector devient
v == [{10,10},{9,9},{8,8},
{10,10},{9,9},{8,8}]
 
 
Voici la classe :  
 

Code :
  1. package copepodtracker;
  2. import java.util.ArrayList;
  3. import java.util.Vector;
  4. import java.io.*; //File, FileReader etc...
  5. import java.awt.image.BufferedImage;
  6. import java.awt.Color;
  7. public class PositionCopepode{
  8.     /*attributs*/
  9.     private ArrayList<Copepode> listeCopepodeThisFrame;
  10.     private ArrayList<ListePosition> listePositionAllFrame;
  11.     private int nbId = 0;       
  12.     public ArrayList[] t = new ArrayList[21];
  13.     int cpt=0;
  14.     /**Constructeur d'un objet PositionCopepode, instancie simplement les ArrayList */
  15.     public PositionCopepode(int nbFrames){
  16. listeCopepodeThisFrame = new ArrayList<Copepode>();
  17. listePositionAllFrame = new ArrayList<ListePosition>();
  18.     }
  19.    
  20.     /**Methode faisant la mise a jour des coordonnées d'un copépode
  21.      * @param id le copépode a mettre a jour
  22.      * @param coord les nouvelles coordonnées
  23.      */
  24.     private void majCopepode(int id, Coordonnee coord){
  25. for(int i=0; i<listeCopepodeThisFrame.size(); i++){
  26.     if(i==id){
  27.  ((Copepode)(listeCopepodeThisFrame.get(i))).setCoordCopepode(coord);
  28.  ((Copepode)(listeCopepodeThisFrame.get(i))).setLost(false);
  29.  return;
  30.     }
  31. }
  32.     }
  33.    
  34.     /**Methode qui identifie les copépodes en fonction de leur coordonnées
  35.      * La methode remplit le ArrayList listeCopepodeThisFrame.
  36.      * @param listeCoordonnee le ArrayList de coordonnées à traiter
  37.      * @param frame le numero de la frame anbalyser
  38.      */
  39.     public void identifier(ArrayList<Coordonnee> listeCoordonnee, int frame){
  40. for(int i=0; i<listeCoordonnee.size(); i++){
  41.     int id = Tracker.rechercheDansZone((Coordonnee)listeCoordonnee.get(i), listeCopepodeThisFrame);
  42.     switch(id){
  43.     case -1 :  /*nouveau copépode, on l'ajoute*/
  44.  listeCopepodeThisFrame.add(new Copepode(nbId, listeCoordonnee.get(i)));          
  45.  nbId++;
  46.  break;
  47.     case -2 : /*croisement*/
  48.  break;
  49.     default :
  50.  /*On met a jour le copépode id avec ses nouvelles coord.*/
  51.  majCopepode(id, (Coordonnee)listeCoordonnee.get(i));
  52.     }
  53. }
  54. //System.out.println(listeCopepodeThisFrame);
  55. listePositionAllFrame.add(new ListePosition(listeCopepodeThisFrame, frame));
  56. t[cpt] = new ArrayList(listeCopepodeThisFrame);
  57. cpt++;
  58.     }
  59.     /**Ecrie les coordonnées des Copepodes dans un fichier texte
  60.      * @param f le fichier de sortie
  61.      */
  62.     public void ecrireCoordDansFichier(FileWriter f){
  63.  for(int i = 0; i<listePositionAllFrame.size(); i++){
  64.     try{
  65.  f.write(listePositionAllFrame.get(i)+"" );
  66.  //f.write(listePositionAllFrame.get(i) + "\n" );
  67.     }catch(IOException ioe){     
  68.  System.out.println("Erreur d'ecriture des resultats (coordonnees)" );
  69.     }
  70.  }
  71. try{
  72.     f.close();
  73. }catch(Exception e){}
  74.     }
  75.     /**Ecrie les coordonnées des copépodes dans une BufferedImage
  76.      * @param im l'image dans laquelle on place les coordonnées
  77.      */
  78.     public void ecrireCoordDansImage(BufferedImage im){
  79. int couleur[]={0xFFFFFFFF, 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFF00, 0xFF00FFFF, 0xFFFF00FF, 0xFF888888, 0xFF40AAFF};
  80. for(int l=0; l<listePositionAllFrame.size(); l++){
  81.     ArrayList listeCopepodeThisFrame = listePositionAllFrame.get(l).getListe();
  82.     for(int i=0; i<listeCopepodeThisFrame.size(); i++){
  83.  Coordonnee coordCop = ((Copepode)listeCopepodeThisFrame.get(i)).getCoordCopepode();
  84.  if(i==0){
  85.      /*Pour la première position, on va placer le n° d'identifiant du copépode*/
  86.            /*a faire*/
  87.  }
  88.  im.setRGB(coordCop.getX(), coordCop.getY(), couleur[((Copepode)(listeCopepodeThisFrame.get(i))).getIdCopepode() % 8]);
  89.     }
  90. }
  91.     }
  92. }


 
 
Merci de votre aide.
S'il faut d'autres détails, je pourrais en fournit ce soir a partir de 17h


Message édité par c0wb0y le 21-04-2005 à 17:27:45
Reply

Marsh Posté le 21-04-2005 à 13:16:25   

Reply

Marsh Posté le 21-04-2005 à 15:19:55    

Bon, j'ai fait plus de test, et mon problème m'est encore plus confu
 
Le problème ne semble pas directement lié au Vector, j'ai essayé une ArrayList et un classique tableau, rien ne change, mes éléments sont perdu en cours de route.
 
Le problème est(du moins je pense) dans la methode identifier().

Reply

Marsh Posté le 21-04-2005 à 16:54:07    

1) elle sert à quoi la boucle dans majCopepode() ??
2) isole un peu mieux ton problème et/ou utilise un debugger : ton code est pas évident à appréhender en l'état

Reply

Marsh Posté le 21-04-2005 à 17:44:30    


Oui, désolé c'était pas très détaillé mais j'ai pas eu énormement de temps ce midi.
1 : Il y a plusieurs Copépode dans la liste, donc on recherche celui à mettre a jour
2 : Je voudrais bien isoler, mais je ne sais pas trop ou se trouve réellement le bug =/
 
Voici un exemple d'output du programme montrant le probleme :  

Citation :

D:\programmation\stage_cnrs_2005>java Test
 
[]
|  0%  frame:100
[100  [0        71      195, 1  177     303, 2  324     408, 3  109     419, 4  549     445]
]
/  5%  frame:101
[100  [0        71      194, 1  174     302, 2  325     408, 3  108     419, 4  549     441]
, 101  [0       71      194, 1  174     302, 2  325     408, 3  108     419, 4  549     441]
]
-  10%  frame:102
[100  [0        70      194, 1  172     302, 2  326     408, 3  107     419, 4  548     440]
, 101  [0       70      194, 1  172     302, 2  326     408, 3  107     419, 4  548     440]
, 102  [0       70      194, 1  172     302, 2  326     408, 3  107     419, 4  548     440]
]
\  15%  frame:103
[100  [0        71      194, 1  171     302, 2  328     408, 3  106     419, 4  548     438]
, 101  [0       71      194, 1  171     302, 2  328     408, 3  106     419, 4  548     438]
, 102  [0       71      194, 1  171     302, 2  328     408, 3  106     419, 4  548     438]
, 103  [0       71      194, 1  171     302, 2  328     408, 3  106     419, 4  548     438]
]
|  20%  frame:104
[100  [0        70      194, 1  170     300, 2  328     408, 3  105     419, 4  549     439]
, 101  [0       70      194, 1  170     300, 2  328     408, 3  105     419, 4  549     439]
, 102  [0       70      194, 1  170     300, 2  328     408, 3  105     419, 4  549     439]
, 103  [0       70      194, 1  170     300, 2  328     408, 3  105     419, 4  549     439]
, 104  [0       70      194, 1  170     300, 2  328     408, 3  105     419, 4  549     439]
]
/  25%  frame:105
[100  [0        70      194, 1  168     300, 2  329     408, 3  105     419, 4  550     436]
, 101  [0       70      194, 1  168     300, 2  329     408, 3  105     419, 4  550     436]
, 102  [0       70      194, 1  168     300, 2  329     408, 3  105     419, 4  550     436]
, 103  [0       70      194, 1  168     300, 2  329     408, 3  105     419, 4  550     436]
, 104  [0       70      194, 1  168     300, 2  329     408, 3  105     419, 4  550     436]
, 105  [0       70      194, 1  168     300, 2  329     408, 3  105     419, 4  550     436]
]
-  30%  frame:106
[100  [0        70      193, 1  167     300, 2  329     409, 3  104     420, 4  551     436]
, 101  [0       70      193, 1  167     300, 2  329     409, 3  104     420, 4  551     436]
, 102  [0       70      193, 1  167     300, 2  329     409, 3  104     420, 4  551     436]
, 103  [0       70      193, 1  167     300, 2  329     409, 3  104     420, 4  551     436]
, 104  [0       70      193, 1  167     300, 2  329     409, 3  104     420, 4  551     436]
, 105  [0       70      193, 1  167     300, 2  329     409, 3  104     420, 4  551     436]
, 106  [0       70      193, 1  167     300, 2  329     409, 3  104     420, 4  551     436]
]
\  35%  frame:107
[100  [0        70      193, 1  166     300, 2  331     409, 3  103     419, 4  551     437]
, 101  [0       70      193, 1  166     300, 2  331     409, 3  103     419, 4  551     437]
, 102  [0       70      193, 1  166     300, 2  331     409, 3  103     419, 4  551     437]
, 103  [0       70      193, 1  166     300, 2  331     409, 3  103     419, 4  551     437]
, 104  [0       70      193, 1  166     300, 2  331     409, 3  103     419, 4  551     437]
, 105  [0       70      193, 1  166     300, 2  331     409, 3  103     419, 4  551     437]
, 106  [0       70      193, 1  166     300, 2  331     409, 3  103     419, 4  551     437]
, 107  [0       70      193, 1  166     300, 2  331     409, 3  103     419, 4  551     437]
]


 
On voit clairement le probleme, au lieu d'ajouter les nouvelles listes les unes a la suite des autres, ca remplace le tout.
 
 
________________________________________________________________
 
Je vais expliquer le cadre du programme :  
 
Je dois réalise un logiciel de suivi de copépode (un copépode est un micro-organismes faisant partie de la famille du zooplancton). J'ai en fait une sequence d'image (une video ramenée en une suite d'image png) que je dois analyser.
 
Sur chaque image se trouve N copépode.  
Le principe de l'algo :  
 

Code :
  1. for(int i=0; i<nbImage; i++){
  2.      Trouver les coordonnées des copépodes (sans les identifier)
  3.      Construire listeCcoordonnees avec ce qu'on a trouver
  4.    
  5.      For(Coordonne coord : listeCoordonnee){
  6.         On cherche a identifier le copépode (lui assigner un id)
  7.         if(e copépode n'existait pas précedemment){
  8.           ajouter copépode identifié dans listeCopépode
  9.         }else{
  10.           Mettre a jour les coordoonnées de ce copépodes
  11.         }
  12.      }
  13.      Ajouter la listeCopepodeThisFrame dans listePositionAllFrame //listePositionAllFrame contient la liste des copépode de chaque image
  14. }


 
J'espere que ce pseudo-code est assez clair
 
 
 
Le probleme est donc dans l'ajout de la liste des copépode de mon image, dans la liste globale : listePositionAllFrame.
Comme je l'ai expliqué dans le premier post, lorsque j'ajoute une liste, toute celle déja présente sont modifiées !
Que ce soit un Vector, une ArrayList ou un tableau, ca me fait ca.
 
Si vous avez besoin d'autre détails, n'hesitait pas, je seche complètement sur cette impasse =/        

Reply

Marsh Posté le 21-04-2005 à 18:00:52    

c0wb0y a écrit :

1 : Il y a plusieurs Copépode dans la liste, donc on recherche celui à mettre a jour


ben non, tu compares l'indice de la boucle à un int passé en paramètre ... ca sert à rien.
fais directement
        ((Copepode)(listeCopepodeThisFrame.get(id))).setCoordCopepode(coord);  
        ((Copepode)(listeCopepodeThisFrame.get(id))).setLost(false);  
 
 

c0wb0y a écrit :


2 : Je voudrais bien isoler, mais je ne sais pas trop ou se trouve réellement le bug =/


C'est tout l'intérêt d'isoler un bug : tu testes indépendament les éléments de ton programme jusqu'à trouver l'endroit où ca se comporte pas comme tu le voudrais.
 
Désolé, j'ai pas le temps de chercher à comprendre ton programme ... peut être que d'autres seront plus courageux que moi.
Je te conseille vivement l'execution pas à pas avec un debugguer pour trouver ton problème

Reply

Marsh Posté le 21-04-2005 à 18:26:14    

benou a écrit :

ben non, tu compares l'indice de la boucle à un int passé en paramètre ... ca sert à rien.
fais directement
        ((Copepode)(listeCopepodeThisFrame.get(id))).setCoordCopepode(coord);  
        ((Copepode)(listeCopepodeThisFrame.get(id))).setLost(false);  
 


 
Lol, je me demande pourquoi j'ai pas fait comme ca directement, je devais avoir la tête ailleurs, merci ^^
 
 
 
Sinon, je me suis jamais servit d'un debugger, c'est le moment de commencer [:totoz]

Reply

Marsh Posté le 21-04-2005 à 18:34:40    

c0wb0y a écrit :

Sinon, je me suis jamais servit d'un debugger, c'est le moment de commencer [:totoz]


ouais !  [:wam]  
 
après on peut plus s'en passer ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed