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

avec Java Discussion :

Constructeur: Valeurs des objets perdues


Sujet :

avec Java

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Par défaut Constructeur: Valeurs des objets perdues
    Bonjour,
    Je débute en Java, et j’ai un petit souci de référence je pense. Pour illustrer mon problème : j’ai une base de données contenant la liste des tests (médicaux) effectués par plusieurs personnes. Une ligne (un n-uplet représente un test précis (par exemple : la vue), donc une personne est présente sur plusieurs lignes. Mais un attribut de cette table contient le code de la personne (CodePers), et qui peut être identique également sur plusieurs lignes.
    J’ai créé une classe ListeTest qui extrait les données de la base -> OK sans problème, je peux les afficher même.
    Mon problème vient de la création de la classe ListePersonne qui contient une ArrayList de classe Personne. Sachant qu’une classe personne a comme attribut une ListeTest.
    Cette classe prend en paramètre une instance de la classe ListeTest.
    Ce que je fais donc c’est que je parcours la ListeTest, et je crée une ListeTest temporaire.
    Je procède comme suit :
    Je prends le premier CodePers
    Tant que CodePers est identique au CodePers suivant alors j’ajoute le Test courant de la ListeTest dans Personne.
    Dès qu’on change de CodePers, on ajoute Personne dans la ListePersonne.
    Pour bien verifier, j’affiche à chaque fois que je change de personne, et tout est correct.
    Par contre si je veux afficher chaque personne à partir de la ListePersonne, il n’affiche rien. La liste contient bien le nombre de personne introduite mais pas les valeurs.

    En code
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     
    public class ListePersonne {
     
    	//l'attribut
    	protected ArrayList<Personne> pers_list;
     
    public ListePersonne(ListeTest lt){
    	try {
    			pers_list = new ArrayList<Personne>();
    			Personne p = new Personne();
    	        for (int j=1;j<(lt.taille());j++){ 	        		
    	        		String tmp = lt.getListeTest().get(j-1).getCodePers();
    		        	if (tmp.equals(lt.getListeTest().get(j).getCodePers())){
    		        				        			p.ajouter(lt.getListeTest().get(j-1));
    		        	}
    		        	else {
    		        		p.ajouter(lt.getListeTest().get(j-1));
    		        		//p.afficher();
    		        		pers_list.add(p);
    		        		p.vider();
    		        	}
     
    		      if(j==(lt.taille()-1)){	
    	        		String tmp2 = lt.getListeTest().get(j).getCodePers();
    	        		if(tmp2.equals(lt.getListeTest().get(j-1).getCodePers())){
    	        			p.ajouter(lt.getListeTest().get(j));
    	        			//p.afficher();
    		        		pers_list.add(p);
    		        		p.vider();
    	        		}
    	        		else {
    	        			p.ajouter(lt.getListeTest().get(j-1));
    	        			//p.afficher();
    	        			pers_list.add(p);
    	        			p.vider();
    	        			p.ajouter(lt.getListeTest().get(j));
    	        			pers_list.add(p);
    	        			p.vider();
    	        		}
    		      } 
    	      System.out.println("Liste personne créée");
    		}
    	catch (Exception ex)
    	{
    		System.out.println("Erreur :"+ex);
    	}
    }
    public void afficher(){
    		System.out.println("nb personne: "+pers_list.size());
    		for (int i=0; i<pers_list.size(); i++)
    			pers_list.get(i).afficher();
    	}
     
    }
     
    }
    (désolé si les indentations ne sont pas très propres)

    Là le souci c’est qu’au final dans la classe, l’attribut pers_liste n’a aucune valeur. C’est comme si c’est une variable locale qui est périmée et donc sa référence n’a plus de valeur.
    Quand je fais un affichage de la ListePersonne… Niet, rien. Pourtant, les affichage (en commentaire dans le code) type p.afficher(), ça fonctionne bien.
    Comment on fait pour que les valeurs restent, sachant qu’en java, de mémoire, il n’y a pas de constructeurs par recopie.

    Merci d’avance pour votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut
    Le p.vider() ne suffit pas, au contraire, cela supprime le travail que tu viens d'effectuer! Lorsque tu ajoute p a ta liste, tu n'ajoute en faite qu'une référence. Il te faut donc à chaque passage dans ta boucle, créer une nouvelle instance que tu ajouteras ensuite à ta liste: p=new ...

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Par défaut
    Merci de la réponse,
    à chaque passage dans la boucle, je dois faire un new? Sachant qu'il y a des milliers (je peux dépasser même le million)de lignes de test, à un moment donner, ça doit depasser la mémoire non??
    Disons que si j'ai 5000 lignes de test, ma boucle se répète donc 5000 fois, donc je fais un new personne 5000 fois or parmi les 5000 il n'y a peut-être que 500 personnes (chacune effectue 10 tests).

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    Je ne connais pas très bien ton traitement, mais si tu veux optimiser l'utilisation de la mémoire, il ne faut evidement pas tout charger.
    Que fait tu de tes lignes ? tu les affiches ?

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Par défaut
    Grosso modo: J'ai des milliers de lignes de Test, une arraylist de Test pour être plus précis. Les lignes qui ont un CodeIdentique, je les stocke dans une autre liste... ainsi de suite, à la fin, j'ai une liste de Personne. Et chaque personne a comme attribut une Liste de Test (dont chaque code est pareil).
    Je ne sais pas quelles lignes tu parles mais, les lignes (dont les codes personnes) identiques que je lis je les copies... et je les mets dans une personnes. Et chaque Personne est stockée dans une Liste de Personne, dont le constructeur est dessus.
    Et c'est la copie de cette liste que je n'y arrive pas.
    J'espère que t'as compris.
    Pour répondre à ta question
    Les lignes je ne les affiche pas, je les traite pour créer d'autres objets (personnes).

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    La réponse est donné pour ton soucis de liste, il te faut créer de nouveau objet, car seule une référence est stocké dans une arraylist. Car sinon tu utilises le même objet tout le temps. Ton arraylist contient donc uniquement des références sur un seul et unique objet.

    Donc si je comprend bien ton traitement est de partir d'une liste de test et de créer une liste de personne qui ont participés au test. Ensuite elle te sert à quoi cette liste de personne ?

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 39
    Par défaut
    Résolu , ceci m'a donné une piste
    Citation Envoyé par psychoP@T Voir le message
    Le p.vider() ne suffit pas, au contraire, cela supprime le travail que tu viens d'effectuer! Lorsque tu ajoute p a ta liste, tu n'ajoute en faite qu'une référence. Il te faut donc à chaque passage dans ta boucle, créer une nouvelle instance que tu ajouteras ensuite à ta liste: p=new ...
    pour faire simple, j'ai juste remplacé p.vider() par p = new Personne(). Donc pas à chaque itération de la boucle for.

    Sinon, Jimmy, pour répondre à ta question, Je dois pouvoir afficher les personnes (en mode graphique, en fonction des tests, date, enfin une sorte de tri quoi) et puis à long terme stocker la liste de personne dans une autre base de donnée pour constituer une sorte d'archive.

    Merci pour vos tuyaux.

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 766
    Par défaut
    Sinon, Jimmy, pour répondre à ta question, Je dois pouvoir afficher les personnes (en mode graphique, en fonction des tests, date, enfin une sorte de tri quoi) et puis à long terme stocker la liste de personne dans une autre base de donnée pour constituer une sorte d'archive.
    D'accord, il faut que tu traites par lot pour eviter les soucis de mémoire.

    Par exemple pour stocker ta liste de personne en base, le plus adapté est de parcourir ta liste de test et de créer une personne à la fois.

    Pour ton affichage de la liste de personne, idem ne pas créer la liste complète en mémoire pour n'afficher au final que 2 ou 3 personnes.

    Dans tous les cas il faut evaluer la mémoire requise, 5000 lignes ça doit passer. Mais 1 million de ligne si chaque ligne fait 1Ko, on est déjà sur du 1Go de taille de JVM. Ca commence à faire beaucoup effectivement.

    Bon courage,

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

Discussions similaires

  1. valeurs des sessions perdues
    Par hamzawii dans le forum Langage
    Réponses: 5
    Dernier message: 06/06/2010, 16h33
  2. Réponses: 0
    Dernier message: 23/05/2009, 15h18
  3. Réponses: 6
    Dernier message: 14/11/2007, 15h51
  4. Réponses: 2
    Dernier message: 20/06/2007, 15h31
  5. Récupérer des valeurs d'objets graphiques à la fermeture d'une figure
    Par biquet dans le forum Interfaces Graphiques
    Réponses: 16
    Dernier message: 25/04/2007, 11h26

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