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 :

problème de list en variable de class


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 4
    Par défaut problème de list en variable de class
    Bonjour, désolé de vous embêter avec mes problèmes mais je sèche dessus depuis un moment et ma dead line se rapproche ^^

    J'ai deux class:
    -Analyse
    -Besoin

    Le constructeur Analyse() appelle la méthode static
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.listeProgTunnel12 = Besoin.getList12ByBesoin(this.listeNouveauBesoin);
    avec la variable de class listNouveauBesoin en paramètre.
    Le problème c'est que au retour de listeProgTunnel12, la variable de class listeNouveauBesoin est égale à la variable locale listeNouveauBesoin de la méthode getList12ByBesoin.
    En gros je ne veux pas que la manipulation de la variable listeNouveauBesoin dans la fonction impacte la variable de class d'Analyse.

    Si vous avez une idée merci ;-)

    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
    package fr.cnam.papplication;
     
     
    import java.util.List;
    import fr.cnam.particle.Article;
    import fr.cnam.pdal.ArticleDao;
    import fr.cnam.pdal.FabriqueDao;
     
    /**
     * @author Pierre
     *
     */
    public class Analyse {
    	/**
             *1-Augmentation du besoin avec l'heure
             *              1.1-Le besoin n'existe pas
             *                      1.1.1-Création Liste de besoin de base pour 30 min
             *      1.2-Le besoin existe déjà
             *                      1.2.1-Ajout d'une min d'augmentation de coefficient
             *2-comparaison des deux listes d'articles
             *              1.1-Pas de changement dans la liste
             *              1.2-Il y a des changements dans la liste
             *                      1.1.1-Un ou plusieurs articles a été ajouté
             *                      1.1.2-Un ou plusieurs articles on été supprimés
             *                      1.1.3-Les deux
             * 3-Calcul du nouveau besoin par article
             * 4-Calcul de la programmation
             * 5-On efface les anciennes listes et on les remplace
             * 6-Enregistrement de liste1 dans le fichier qui devient liste2
             * 
             */
     
    	private List<Besoin>listeAncienBesoin;
    	private List<Besoin>listeNouveauBesoin;
    	private List<Article>listeAncienTunnel12;
    	private List<Article>listeAncienTunnel14;
    	private List<Article>listeProgTunnel12;
    	private List<Article>listeProgTunnel14;
     
    //************************************Constructeur******************************************
     
    	public Analyse(){
    		this.listeAncienBesoin= ancienBesoin();
    		this.listeNouveauBesoin = analyseDeTunnel();
    			System.out.println("listeNouveauBesoin : dans analyse (avant Besoin.getList12ByBesoin)");
    			for (Besoin b : listeNouveauBesoin) {//Je teste la liste
    				System.out.println(b);
    			}
    		this.listeProgTunnel12 = Besoin.getList12ByBesoin(this.listeNouveauBesoin);
    			System.out.println("listeNouveauBesoin : dans analyse (après Besoin.getList12ByBesoin)");
    			for (Besoin b : listeNouveauBesoin) {//Je reteste la liste, et là surprise elle est différente.
    				System.out.println(b);
    			}
    		this.listeProgTunnel14 = Besoin.getList14ByBesoin(this.listeNouveauBesoin);
    	}

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    package fr.cnam.papplication;
     
     
    import java.util.ArrayList;
    import java.util.List;
    import java.util.ListIterator;
     
    import fr.cnam.particle.Article;
    import fr.cnam.particle.TCategorie;
     
    /**
     * @author Pierre
     *
     */
     
    public class Besoin{
    	private Article article;
    	private double besoinActuel; 
     
    	public Besoin(){
    		this.article = null;
    		this.besoinActuel = 0;
    	}
     
    	public Article getArticle() {
    		return article;
    	}
     
    	public void setArticle(Article article) {
    		this.article = article;
    	}
     
    	public double getBesoinActuel() {
    		return besoinActuel;
    	}
     
    	public void setBesoinActuel(double besoinActuel) {
    		this.besoinActuel += besoinActuel;
    		if (this.besoinActuel<0) {
    			this.besoinActuel=0;
    		}
    	}	
     
    	protected static List<Besoin> besoinParDefault(){ //Besoin par article pour 30 min
    		List<Besoin>listeAncienBesoin = new ArrayList<Besoin>();
    		String string = new String();
    		try {
    			for (TCategorie cat : TCategorie.values()) {	
    				string = "fr.cnam.particle."+cat;
    				Object o = Class.forName(string).newInstance();
    				Article a = (Article) o;
    				Besoin b = new Besoin();
    				b.setArticle(a);
    				//Je ne charge le besoin que pour 5 min au démarrage car entre le lancement du programme et le démarrage des tunnels 25 min vont s'écouler
    				b.setBesoinActuel(a.getBesoinParMin()*5);
    				listeAncienBesoin.add(b);
    				System.out.println("besoin par default + "+a+" besoin actuel "+b.getBesoinActuel());
    	    	}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} 
    		return listeAncienBesoin;
    	}
     
    	public static List<Article> getList12ByBesoin(List<Besoin> listeNouveauBesoin){
    		List<Article>listeProgTunnel12 = new ArrayList<Article>();
    		int p,j;
    		//Ecarte les articles marginaux qui vont sur la voie 13
    //		 ArrayList<String> ar = new ArrayList<String>(); 
    //		for (ListIterator<Besoin> i = listeAncienBesoin.listIterator(); i.hasNext(); i.next()) {
    //		    i.add("hello");
    		ListIterator<Besoin> i = listeNouveauBesoin.listIterator();
    		System.out.println("GetList12ByBesoin :");
    		while (i.hasNext()) {
    			Besoin b = i.next();
    			Article a = b.getArticle();
    			TCategorie cat = a.getCategorie();
    			System.out.println(b.getArticle()+" besoin actuel "+b.getBesoinActuel());
    			if((cat==TCategorie.FiletFragile)||(cat==TCategorie.LaineDelicat)||(cat==TCategorie.SacsSlingArticle)) {
    				i.remove();
    			}
    			//pour le tunnel 12
    			//On va supprimer les besoins de la liste du tunnel 14 (concerne moins d'articles)
    			if((cat==TCategorie.Drap)||(cat==TCategorie.DrapHousse)||(cat==TCategorie.Alese)||(cat==TCategorie.Eponge)||(cat==TCategorie.Couverture)) {
    				i.remove();
    			}
    		}	
    		while (listeProgTunnel12.size()<10) {// Relance la boucle jusqu'à ce que la liste soit de 10 articles
    			for (Besoin b1: listeNouveauBesoin) { // va tester tous les besoins de la liste
    				j=1;
    				if(listeProgTunnel12.size()>=10) //Maintient la liste à 10 meme si tout les Besoin n'ont pas été testé dans la boucles(On a les 10 plus grands)
    					break;
    				for (Besoin b2 : listeNouveauBesoin) {//Compare tous les besoin entre eux
    					if(b1.getBesoinActuel()<b2.getBesoinActuel()) {
    						break;//Ce n'est pas le plus grand besoin restant donc on va chercher un nouveau besoin
    					}else if(j==listeNouveauBesoin.size()){// Toute la liste a été testé et le besoin b est le plus grand besoin restant
    						p = listeNouveauBesoin.indexOf(b1);
    						listeProgTunnel12.add(b1.getArticle());// On ajoute l'article à la liste de programmation
    						b1.setBesoinActuel(-1);
    						//On modifie le besoin de l'article 
    						//On ne modifie pas la valeur de class de la liste nouveaubesoin. Celle ci se modifie uniquement avec l'action lavage
    						listeNouveauBesoin.set(p, b1);// On réinscrit la modification dans la liste
    					}else {// On passe à la comparaison suivante
    						j++;
    					}
    				}
    			}
    		}
    		System.out.println("list de la variable locale listeNouveauBesoin :");
    		for (Besoin b1: listeNouveauBesoin) {
    			System.out.println(b1);
    		}
    		return listeProgTunnel12;
    	}
     
    	public static List<Article> getList14ByBesoin(List<Besoin> listeNouveauBesoin){
    		int p;
    		List<Besoin>listeBesoinT14 = new ArrayList<Besoin>();
    		List<Article>listeProgTunnel14 = new ArrayList<Article>();
    		ListIterator<Besoin> i = listeNouveauBesoin.listIterator();
    		System.out.println("GetList14ByBesoin :");
    		while (i.hasNext()) {
    			Besoin b = i.next();
    			Article a = b.getArticle();
    			TCategorie cat = a.getCategorie();
    			System.out.println("Article dans besoin + "+b.getArticle()+" besoin actuel "+b.getBesoinActuel());
    			//On récupère uniquement les articles qui vont sur la voie 14
    			if((cat==TCategorie.Drap)||(cat==TCategorie.DrapHousse)||(cat==TCategorie.Alese)||(cat==TCategorie.Eponge)||(cat==TCategorie.Couverture)) {
    				listeBesoinT14.add(b);
    			}
    		}
    		//Pour le tunnel14
    		//On récupère les articles du tunnel 14
    		while (listeProgTunnel14.size()<10) {// Relance la boucle jusqu'à ce que la liste soit de 10 articles
    			for (Besoin b1: listeBesoinT14) { // va tester tous les besoins de la liste
    				int j=1;
    				for (Besoin b2 : listeBesoinT14) {//Compare tous les besoin entre eux
    					if(b1.getBesoinActuel()>b2.getBesoinActuel()) {
    						break;//Ce n'est pas le plus grand besoin restant donc on va chercher un nouveau besoin
    					}else if(j==listeBesoinT14.size()){// Toute la liste a été testé et le besoin b est le plus grand besoin restant
    						p = listeBesoinT14.indexOf(b1);
    						listeProgTunnel14.add(b1.getArticle());// On ajoute l'article à la liste de programmation
    						b1.setBesoinActuel(-1);
    							//On modifie le besoin de l'article 
    							//On ne modifie pas la valeur de class du besoin. Celle ci se modifie uniquement avec l'action lavage
    						listeBesoinT14.set(p, b1);// On réinscrit la modification dans la liste
    					}else {// On passe à la comparaison suivante
    						j++;
    					}
    				}
    			}
    		}
    		return listeProgTunnel14;
    	}
    }
    La console me renvoie
    listeNouveauBesoin : dans analyse (avant Besoin.getList12ByBesoin)
    fr.cnam.papplication.Besoin@25a6944c
    fr.cnam.papplication.Besoin@5e1fa5b1
    fr.cnam.papplication.Besoin@6b00f608
    fr.cnam.papplication.Besoin@2f17e30d
    fr.cnam.papplication.Besoin@3e821657
    fr.cnam.papplication.Besoin@1d131e1b
    fr.cnam.papplication.Besoin@71cf1b07
    fr.cnam.papplication.Besoin@615091b8
    fr.cnam.papplication.Besoin@4fce136b
    fr.cnam.papplication.Besoin@4aa83f4f
    fr.cnam.papplication.Besoin@43b6123e
    fr.cnam.papplication.Besoin@260e86a1
    fr.cnam.papplication.Besoin@19648c40
    fr.cnam.papplication.Besoin@12bd8a64
    fr.cnam.papplication.Besoin@61e94def
    fr.cnam.papplication.Besoin@3300f4fd
    fr.cnam.papplication.Besoin@ebb6851
    fr.cnam.papplication.Besoin@70ab2d48
    fr.cnam.papplication.Besoin@5b068087
    GetList12ByBesoin :
    fr.cnam.particle.Alese@fc258b1 besoin actuel 0.06666667014360428
    fr.cnam.particle.Blouse@6ff65192 besoin actuel 0.46666666865348816
    fr.cnam.particle.Casaque@2dd80673 besoin actuel 0.03333333507180214
    fr.cnam.particle.Chemise@4af0df05 besoin actuel 0.23333333432674408
    fr.cnam.particle.Chiffonette@57ea113a besoin actuel 0.12222222238779068
    fr.cnam.particle.Contamine@acdb094 besoin actuel 0.17777778208255768
    fr.cnam.particle.Couverture@674bd420 besoin actuel 0.42222219705581665
    fr.cnam.particle.DessusLit@2b0f373b besoin actuel 0.03333333507180214
    fr.cnam.particle.DrapHousse@2ceb80a1 besoin actuel 0.1666666716337204
    fr.cnam.particle.Drap@4b45dcb8 besoin actuel 1.4333332777023315
    fr.cnam.particle.Eponge@7216fb24 besoin actuel 0.42222219705581665
    fr.cnam.particle.FiletFragile@2072acb2 besoin actuel 0.0
    fr.cnam.particle.FrangeMenage@50ecde95 besoin actuel 0.2888888716697693
    fr.cnam.particle.LaineDelicat@35a9782c besoin actuel 0.0
    fr.cnam.particle.Menu@70a36a66 besoin actuel 0.2888888716697693
    fr.cnam.particle.Sac@45815ffc besoin actuel 0.25555554032325745
    fr.cnam.particle.Technique@732f29af besoin actuel 0.0
    fr.cnam.particle.TenueBloc@d3957fe besoin actuel 0.24444444477558136
    fr.cnam.particle.SacsSlingArticle@6622fc65 besoin actuel 0.0
    list de la variable locale listeNouveauBesoin :
    fr.cnam.papplication.Besoin@5e1fa5b1
    fr.cnam.papplication.Besoin@6b00f608
    fr.cnam.papplication.Besoin@2f17e30d
    fr.cnam.papplication.Besoin@3e821657
    fr.cnam.papplication.Besoin@1d131e1b
    fr.cnam.papplication.Besoin@615091b8
    fr.cnam.papplication.Besoin@19648c40
    fr.cnam.papplication.Besoin@61e94def
    fr.cnam.papplication.Besoin@3300f4fd
    fr.cnam.papplication.Besoin@ebb6851
    fr.cnam.papplication.Besoin@70ab2d48
    listeNouveauBesoin : dans analyse (après Besoin.getList12ByBesoin)
    fr.cnam.papplication.Besoin@5e1fa5b1
    fr.cnam.papplication.Besoin@6b00f608
    fr.cnam.papplication.Besoin@2f17e30d
    fr.cnam.papplication.Besoin@3e821657
    fr.cnam.papplication.Besoin@1d131e1b
    fr.cnam.papplication.Besoin@615091b8
    fr.cnam.papplication.Besoin@19648c40
    fr.cnam.papplication.Besoin@61e94def
    fr.cnam.papplication.Besoin@3300f4fd
    fr.cnam.papplication.Besoin@ebb6851
    fr.cnam.papplication.Besoin@70ab2d48
    GetList14ByBesoin :
    Article dans besoin + fr.cnam.particle.Blouse@6ff65192 besoin actuel 0.0
    Article dans besoin + fr.cnam.particle.Casaque@2dd80673 besoin actuel 0.0
    Article dans besoin + fr.cnam.particle.Chemise@4af0df05 besoin actuel 0.0
    Article dans besoin + fr.cnam.particle.Chiffonette@57ea113a besoin actuel 0.0
    Article dans besoin + fr.cnam.particle.Contamine@acdb094 besoin actuel 0.0
    Article dans besoin + fr.cnam.particle.DessusLit@2b0f373b besoin actuel 0.0
    Article dans besoin + fr.cnam.particle.FrangeMenage@50ecde95 besoin actuel 0.0
    Article dans besoin + fr.cnam.particle.Menu@70a36a66 besoin actuel 0.0
    Article dans besoin + fr.cnam.particle.Sac@45815ffc besoin actuel 0.0
    Article dans besoin + fr.cnam.particle.Technique@732f29af besoin actuel 0.0
    Article dans besoin + fr.cnam.particle.TenueBloc@d3957fe besoin actuel 0.0

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    C'est tout à fait normal que la liste soit modifiée puisque c'est ce qui est fait en supprimant ou modifiant des éléments (et même en en ajoutant dans une autre méthode). Si tu veux l'éviter il te suffit

    1. de passer en argument une copie de la liste,
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      this.listeProgTunnel12 = Besoin.getList12ByBesoin(new ArrayList<>(this.listeNouveauBesoin));
      ou de faire la copie dans la méthode (et de modifier la copie)
    2. ou te t'arranger pour ne pas modifier la liste
      Pour les "remove", plutôt utiliser un stream et filter
      Pour les set, on peut carrément les enlever, ils ne servent à rien. C'est même toute la double boucle qui peut être simplifiée. Si je comprend bien le but d'avoir les 10 plus grands.
      On peut tout faire par un Stream.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      return list.stream()
                 .filter( predicat )
                 .sorted( comparator )
                 .limit(10)
                 .map( pour récupérer l'article )
                 .collect(Collectors.toList())
      Si tu ne peux pas utiliser de Stream, pour la partie "remove", une copie avec un for et un if pour ne copier que ce qu'on veut. Il y a aussi la méthode List.removeIf() (à faire sur une copie).
      Et pour la partie les "10 plus grands", un tri, et un sublist.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 4
    Par défaut
    Merci beaucoup Joel

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

Discussions similaires

  1. [Débutant] Problème avec List et variable
    Par Junuar dans le forum C#
    Réponses: 2
    Dernier message: 31/01/2016, 02h20
  2. Problème de passage de variable entre class
    Par yasen77 dans le forum Applets
    Réponses: 0
    Dernier message: 30/07/2010, 11h54
  3. Réponses: 11
    Dernier message: 04/07/2009, 09h59
  4. STL Problème avec une liste d'instances de class
    Par BruceBoc dans le forum SL & STL
    Réponses: 12
    Dernier message: 16/02/2007, 14h12
  5. Réponses: 2
    Dernier message: 11/09/2006, 12h22

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