Partage
  • Partager sur Facebook
  • Partager sur Twitter

petit problème en java

    11 mai 2012 à 21:00:21

    Bonjour,
    J'ai quelques petites erreur dans mon code , je les ai identifiées mais je ne sais pas comment faire .
    Je pense que c'est tout bête et ça m'énerve d'autant plus.
    Mon équipage est un arrayList et donc il ne peut être inférieur a 2 qui est un int .
    Or ce que je voulais faire c'est dire que si mon équipage est inférieur à 2 personnes et supérieur a 10 personnes alors ce n'est pas bon, du coup là j'ai une erreur dans la condition du else if du public void pretAdecoller.

    Voici le code:
    import java.util.ArrayList;
    
    public class Vaisseau 
    {	
    	private String nom;
    	private String type;
    	private String proprete;
    	private String etat;
    	private ArrayList<Operateur> equipage;
    	private int vie;
    	int index;
    	
    	
    	
    	
    	public String sePresenter()
    	{
    		System.out.println("-------------------------------------------------------");
    		return "Vaisseau : Le nom du vaisseau est "+nom+" ,il est de type "+type+" ,il est "+proprete+" et "+etat+". Sa vie est de "+vie+".";
    	}
    		
    	public void vie()
    	{
    		
    		if (type=="guerre")
    		{
    			vie=100;
    		}
    		else if (type=="marchand")
    		{
    			vie=50;
    		}
    		else if (vie==0){
    			System.out.println("Le vaisseau "+nom+"est detruit.");
    		}
    	}
    
    	
    	public void ajouter(Operateur e)
    	{
    		equipage.add(e);
    		index=equipage.size()-1;
    		System.out.println(equipage.get(index).nom+" est à la place "+index+" dans le vaisseau "+nom);
    		System.out.println("il y a "+equipage.size()+" membres d'equipage.");
    	}
    	
    	public void pretAdecoller()
    	{	
    		if(proprete=="sale")
    		{
    			System.out.println("=> Le vaisseau "+nom+" est sale, il ne peut pas décoller.");
    		}
    		else if(etat=="avarié")
    		{
    			System.out.println("=> Le vaisseau "+nom+" est avarié, il ne peut pas décoller.");
    		}
    		else if(equipage<2 && equipage>10)
    		{
    			System.out.println("=> Le vaisseau "+nom+" comporte un nombre de membres d'équipage non réglementaire");
    		}
    		else
    		{
    			System.out.println("=> Le vaisseau "+nom+" peut décoller.");
    		}
    	}
    	
    	public void remettreEnEtat(Operateur e)
    	{
    		if(proprete=="sale")
    		{
    			if(metier=="agent entretien")
    			{
    				proprete="propre";
    				System.out.println("=> Le vaisseau a été nettoyer, il est "+proprete);
    			}
    			else
    			{
    				System.out.println("=> Veuillez ajouter un agent d'entretien dans l'equipage afin de nettoyer le vaisseau");
    			}
    		}
    		if(etat=="avarié")
    		{
    			if(metier=="agent de maintenance")
    			{
    				etat="en etat de marche";
    				System.out.println("=> Le vaisseau a été reparé, il est "+etat);
    			}
    			else
    			{
    				System.out.println("=> Veuillez ajouter un agent de maintenance dans l'equipage afin de réparer le vaisseau");
    			}
    		}
    	}
    	
    	public Vaisseau(String n,String t,String p,String et,int v)
    	{
    		nom=n;
    		type=t;
    		proprete=p;
    		etat=et;
    		vie=v;
    		equipage= new ArrayList<Operateur>();
    	}
    	
    }
    


    Merci d'avance ;)
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      11 mai 2012 à 21:10:14

      equipage, c'est un ArrayList, pas un entier. Pour avoir la taille de ton équipage, c'est equipage.size() que tu dois mettre.
      • Partager sur Facebook
      • Partager sur Twitter
        11 mai 2012 à 21:19:10

        Comme la dit brubru pour obtenir la taille d'une arraylist tu dois utiliser la méthode size() ;)

        Dans ton cas je pense que tu veux afficher le message si l’équipage est inférieur à 2 OU supérieur à 10 car la actuellement dans ta condition tu fais un test si l’équipage est inférieur à 2 ET supérieur à 10 donc tu ne satisferas jamais la condition.

        ta condition sera donc :

        else if(equipage.size()<2 || equipage.size()>10)
        {
        	System.out.println("=> Le vaisseau "+nom+" comporte un nombre de membres d'équipage non réglementaire");
        }
        


        En espérant t'avoir aider :)
        • Partager sur Facebook
        • Partager sur Twitter
          11 mai 2012 à 21:39:57

          Ah oui en effet merci ;)
          Je l'avais utilisé ailleurs en plus équipage.size() mais j'ai pas pensé à l'utiliser ici .
          Mais oui bien sur , punaise je me suis gourré dans les signes fallait bien mettre des || et non des && , merci mimich9124 ;)

          Sinon comment faire pour aller chercher des valeurs d'un autre fichiers car ça me mets des erreurs.
          Je remet ma classe remettreEnEtat que j'ai légèrement modifier dans le fichier Vaisseau.java :
          public void remettreEnEtat()
          	{
          		if(proprete=="sale")
          		{
          			if(metier=="agent entretien")
          			{
          				proprete="propre";
          				System.out.println("=> Le vaisseau a été nettoyer, il est "+proprete);
          			}
          			else
          			{
          				System.out.println("=> Veuillez ajouter un agent d'entretien dans l'equipage afin de nettoyer le vaisseau");
          			}
          		}
          		if(etat=="avarié")
          		{
          			if(metier=="agent de maintenance")
          			{
          				etat="en etat de marche";
          				System.out.println("=> Le vaisseau a été reparé, il est "+etat);
          			}
          			else
          			{
          				System.out.println("=> Veuillez ajouter un agent de maintenance dans l'equipage afin de réparer le vaisseau");
          			}
          		}
          	}
          


          Ce morceau de code est censé remettre en état mon vaisseau donc par exemple si mon vaisseau est sale il faut qu'il regarde dans mon équipage si il y un membre dont le métier est agent d'entretien par exemple afin de changer la propreté du vaisseau en propre et qu'ainsi le vaisseau puisse décoller.
          Le problème que je rencontre c'est que le métier de mes membres d'équipage est définit dans un autre fichier qui s'appelle Operateur.java car tous les paramètres de mes membres d'équipage sont définit dans ce fichier puisque tous mes membres d'équipage qu'importe leur métier sont des opérateurs. Ainsi il ne reconnait pas le paramètre métier.
          De plus mes opérateurs sont ajoutées via la fonction ajouter du fichier Vaisseau.java donc je pense (mais je suis pas sur) qu'il faille faire intervenir dans mon code le paramètre équipage non ?



          Je laisse le sujet ouvert je vais surement avoir d'autres questions car je lutte un peu beaucoup, ça évitera d'ouvrir plusieurs sujets.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            11 mai 2012 à 22:03:52

            Dans ta classe Operateur, tu peux faire une méthode abstraite getMetier() (à redéfinir dans tes sous-classes). Puis dans ton Vaisseau, tu définis une méthode hasMetier(String metier) qui parcourt ton équipage à la recherche d'un membre connaissant ce métier.

            Tu n'auras plus qu'à remplacer tes conditions (metier == "truc") par (hasMetier("truc"))
            • Partager sur Facebook
            • Partager sur Twitter
              12 mai 2012 à 0:09:10

              Merci pour ta réponse.
              Vu que je voyais pas trop comment faire j'ai fais ça dans ma méthode qui pose problème :
              public void remettreEnEtat(Operateur e)
              	{
              		if(proprete=="sale")
              		{
              			if(e.metier=="agent entretien")
              			{
              				proprete="propre";
              				System.out.println("=> Le vaisseau a été nettoyer, il est "+proprete);
              			}
              			else
              			{
              				System.out.println("=> Veuillez ajouter un agent d'entretien dans l'equipage afin de nettoyer le vaisseau");
              			}
              		}
              		if(etat=="avarié")
              		{
              			if(e.metier=="agent de maintenance")
              			{
              				etat="en etat de marche";
              				System.out.println("=> Le vaisseau a été reparé, il est "+etat);
              			}
              			else
              			{
              				System.out.println("=> Veuillez ajouter un agent de maintenance dans l'equipage afin de réparer le vaisseau");
              			}
              		}
              	}
              

              En mettant des e.metier avec comme paramètre d'entrée Operateur e .
              Ca ne m'affiche à priori pas d'erreur mais est ce que le code est bon ?
              Parce qu'après dans ma classe main que j'ai appelé Monde.java je n'arrive pas à faire appelle à tous mon équipage afin qu'il vérifie s'il y a un agent d'entretien.
              Je n'y arrive qu'en faisant : va.remettreEnEtat(oa); ou va est le nom de mon vaisseau et oa un opérateur en particulier.
              Evidemment si je cible un opérateur en particulier il ne pourra pas chercher dans tous l'équipage ... y'a pas une petite fonction ou une petite modification qui ferait appelle à tous mon équipage et qui regarderait si y'a un membre qui a le bon métier dedans ?
              Ou faut que je vire tous et que je recommence différemment ?
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                12 mai 2012 à 0:22:33

                l'égalité entre objets(et donc les String) se fait avec la méthode equals, pas == qui est pour tester l'égalité entre références.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  12 mai 2012 à 10:08:29

                  La petite fonction, c'est la méthode hasMetier(String metier) dont je te parlais dans mon message précédent. En gros, dans la fonction, tu fais une boucle qui parcourt les membres de ton équipage à la recherche d'un Operateur ayant le métier désiré. Si tu en trouves un tu retournes true, sinon false.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 mai 2012 à 19:07:21

                    Petit conseil : Pour plus de simplicité dans ce genre de code, utilise une enumération ;) .

                    Ensuite, une chaine de caractère n'est pas == "une autre chaine". On fait maChaine.equals(autreChaine) ou maChaine.equalsIgnoreCase(autreChaine) pour ignorer les majuscules / minuscules.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 mai 2012 à 12:35:22

                      Je reprends ce sujet puisque c'est la suite de mon exercice , j'ai encore quelque problème ...
                      Je mets le code d'abord pour expliquer plus facilement après.

                      Vaisseau.java:
                      import java.util.ArrayList;
                      
                      public class Vaisseau 
                      {	
                      	public String nom;
                      	public String type;
                      	public String proprete;
                      	public String etat;
                      	public ArrayList<Operateur> equipage;
                      	public int vie;
                      	int index;
                      	boolean decollage;
                      	
                      	
                      	public String sePresenter()
                      	{
                      		System.out.println("-------------------------------------------------------");
                      		return "Vaisseau : Le nom du vaisseau est "+nom+" ,il est de type "+type+" ,il est "+proprete+" et "+etat+". Sa vie est de "+vie+".";
                      	}
                      	
                      	public String getteur()
                      	{
                      		return nom;
                      	}
                      	
                      		
                      	public void vie()
                      	{
                      		
                      		if (type=="guerre")
                      		{
                      			vie=100;
                      		}
                      		else if (type=="marchand")
                      		{
                      			vie=50;
                      		}
                      		else if (vie==0){
                      			System.out.println("Le vaisseau "+nom+"est detruit.");
                      		}
                      	}
                      
                      	
                      	public void ajouter(Operateur e)
                      	{
                      		if (equipage.size()>=9)
                      		{
                      			System.out.println("Il y a déja 10 membres d'équipage.");
                      		}
                      		else{
                      			equipage.add(e);
                      			index=equipage.size()-1;
                      			System.out.println("=> "+equipage.get(index).nom+" est à la place "+index+" dans le vaisseau "+nom);
                      			System.out.println("----------- il y a "+equipage.size()+" membres d'equipage.-----------");
                      		}
                      	}
                      	
                      	public boolean pretAdecoller()
                      	{	
                      		if(proprete=="sale" || etat=="avarié" || (equipage.size()<2 || equipage.size()>10))
                      		{
                      			return false;
                      		}
                      		return true;
                      	}
                      	
                      	public void affichepretAdecoller()
                      	{	
                      		if(pretAdecoller()==true)
                      		{
                      			System.out.println("Le vaisseau est pret à décoller");
                      		}
                      		else{
                      			System.out.println( "Le vaisseau n'est pas pret à décoller, vérifier la propreté, l'etat et le nombre de membre d'equipage.");
                      		}
                      	}
                      	
                      	
                      	
                      	public boolean remettreEnEtatProprete(Operateur e){
                      		if(proprete=="sale" && e.metier=="agent entretien")
                      		{
                      			proprete="propre";
                      			return true;
                      		}
                      		else{
                      			return false;
                      		}
                      	}
                      	
                      	public boolean remettreEnEtateEtat(Operateur e){
                      		if(etat=="avarié" && e.metier=="agent de maintenance")
                      		{
                      			etat="en état de marche";
                      			return true;
                      		}
                      		else{
                      			return false;
                      		}
                      	}
                      	
                      	public void remettreEnEtat(Operateur e){
                      		if(remettreEnEtatProprete(e)==true && remettreEnEtateEtat(e)==true){
                      			System.out.println("OK");
                      		}
                      		else{
                      			System.out.println("PAS OK");
                      		}
                      		
                      	}
                      	
                      	public void decoller(Operateur e)
                      	{
                      		if(proprete=="propre" && etat=="en etat de marche" && e.metier=="pilote")
                      		{
                      			System.out.println("=> Le vaisseau peut décoller, il ne reste plus qu'au pilote d'agir.");
                      		}
                      		else
                      		{
                      			System.out.println("=> Toute les conditions ne sont pas reunis pour que le vaisseau soit pret a decoller.");
                      		}
                      	}
                      	
                      	public Vaisseau(String n,String t,String p,String et,int v)
                      	{
                      		nom=n;
                      		type=t;
                      		proprete=p;
                      		etat=et;
                      		vie=v;
                      		equipage= new ArrayList<Operateur>();
                      	}
                      	
                      }
                      


                      Et ma classe principal Monde.java:
                      public class Monde 
                      {
                      	public static void main (String args[])
                      	{	
                      		//MISSION NUMERO 1  -------------------------------
                      		//Operateur
                      		Operateur oa=new Operateur("Jean",24,"homme",0,"pilote");
                      		System.out.println(oa.sePresenter());//présentation
                      		oa.vieillir();//vieillir
                      		oa.agir();//agir
                      		System.out.println(oa.sePresenter());
                      		//---------------
                      		Operateur ob=new Operateur("Jeremy",22,"homme",0,"agent de maintenance");
                      		//---------------
                      		Operateur oc=new Operateur("Clément",38,"homme",0,"agent entretien");
                      		
                      		//Mentaliste
                      		Mentaliste ma=new Mentaliste("Michel",40,"homme",100);
                      		System.out.println(ma.sePresenter());//présentation
                      		ma.vieillir();//vieillir
                      		ma.agir(oa);//agir
                      		
                      		//MISSION NUMERO 2 -------------------------------
                      		//PARTIE VAISSEAU
                      		Vaisseau va=new Vaisseau("Optimus","marchand","sale","avarié",0);
                      		va.vie();
                      		System.out.println(va.sePresenter());
                      		
                      		System.out.println(va.getteur());
                      		//---------------
                      		va.ajouter(oa);
                      		va.ajouter(ob);
                      		va.ajouter(oc);
                      		//---------------
                      		va.pretAdecoller();
                      		va.affichepretAdecoller();
                      		//---------------
                      		va.remettreEnEtatProprete(oc);
                      		va.remettreEnEtateEtat(ob);
                      		va.remettreEnEtat(oc);
                      
                      		//---------------
                      		//va.decoller(oa);
                      		//va.decoller(ob);
                      		//va.decoller(oc);
                      		
                      	}
                      }
                      


                      Donc tous fonctionne jusqu'a la fonction remettreEnEtat. Donc cette fonction doit remettre en état mon vaisseau elle doit si la propreté est sale regarder dans l'équipage si un membre est agent d'entretien , si oui le vaisseau devient propre . C'est ce que j'ai essayer de faire dans la fonction remettreEnEtatProprete qui retourne vrai si le vaisseau a été nettoyer . La meme chose avec la fonction remettreEnEtatEtat qui répare le vaisseau.
                      Ainsi dans la fonction suivante remettreEnEtat on récupère les valeur ( vrai ou faux ) de deux précédentes fonctions afin de dire que le vaisseau est complètement remis en état. J'espère que c'est clair pour l'instant .
                      Voila mais mon problème c'est que dans toutes ces fonctions je vois pas quoi mettre d'autre comme entrée a part Operateur e qui va regarder dans ma classe Operateur.
                      Sauf qu'en faisant ça, ça ne regarde qu'un seul opérateur précis , en effet dans la classe Monde quand je veux exécuter ces fonctions je dois mettre "va.remettreEnEtat(oc);" ; ça regarde donc bien que l'opérateur oc et non tous l'équipage. Or il faudrait que je puisse regarder tous l'équipage au lieu d'un seul opérateur précis et c'est ça que je ne sais pas faire.
                      J'espère que quelqu'un pourra m'aidez j'ai essayer d'être assez clair dans mes explications.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        20 mai 2012 à 13:41:48

                        C'est toujours le même problème qu'au début. Bon, je vais t'aider "un peu". Pour remettreEnEtatProprete par exemple. Tu veux que ta fonction vérifie tous les membres de l'équipage. Donc mettre un opérateur en paramètre ne sert pas à résoudre ton problème.

                        Il y a des façons plus optimisées pour faire ça mais je vais te donner une idée de base.

                        Comme tu veux chercher un nettoyeur dans ton équipage, tu fais une boucle (dans remettreEnEtatProprete) qui parcourt ton équipage et qui cherche si un membre a le bon métier.

                        Edit : Et pour comparer des String, utilise .equals(), pas ==
                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 mai 2012 à 11:00:08

                          Merci bien pour ta repose ;)
                          C'est bon j'au réussi avec des for et j'ai changé les == par les .equals().

                          Par contre j'ai une petite erreur dans l'exécution d'une fonction je ne vois pas ce qui bug .
                          Pour ajouter un membre d'équipage il ne faut pas que l'équipage comporte deja 10 personnes ( mon code marche ) et il ne faut pas nom plus qu'un personne que l'on ajoute comporte le meme nom qu'un opérateur deja présent dans l'équipage.
                          C'est ce que j'ai voulu faire avec la fonction membreDifferent()

                          public void ajouter(Operateur e)
                          	{
                          		
                          		if (equipage.size()>=10)
                          		{
                          			System.out.println("WARNING ! === Il y a déja 10 membres d'équipage. ===");
                          		}
                          		else if (membreDifferent()==false)
                          		{
                          			System.out.println("WARNING ! === Ce nom existe déja. ===");
                          		}
                          		else 
                          		{
                          			equipage.add(e);
                          			System.out.println("=> "+e.nom+" est à la place "+equipage.size()+" dans le vaisseau "+nom);
                          			System.out.println("----------- il y a "+equipage.size()+" membres d'equipage.-----------");
                          		}
                          	}
                          	
                          	public boolean membreDifferent(){
                          		
                          		for (int i=0;i<equipage.size();i++)
                          		{
                          			
                          			Operateur e = equipage.get(i);
                          			Operateur oe = (Operateur) e;
                          		
                          			if (oe.nom.equals(e.nom))
                          			{
                          				return false;
                          			}
                          		}
                          		return true;
                          	}
                          


                          Dans ma classe Monde j'ai rentrée 10 opérateurs , le premier est Jean, le deuxième Jeremy et les 8 suivants sont Clément .
                          Or il m'affiche la phrase que j'ai mise ("WARNING ! === Ce nom existe déja. ===") à partir de Jeremy ce qui fait qu'il n'y a que Jean dans l'équipage. Pourtant Jeremy est le seul aussi et ne devrait pas afficher ma phrase de warning .

                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 mai 2012 à 11:24:04

                            Là tu compares les noms des mêmes objects, donc normal qu'ils soient toujours égaux...
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Je ne réponds pas aux MP techniques, les forums sont là pour ça / Danser le rock à Lille / BetaSeries
                              21 mai 2012 à 11:25:58

                              Oui je me doutais bien que c'était ça mais comment faire ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                21 mai 2012 à 12:36:49

                                Quand tu fais Operateur e = equipage.get(i) tu "écrases" le e de ta fonction ajouter. Si tu changes son nom (op par exemple), ça devrait marcher.

                                Ceci dit, ton equipage est un ArrayList<Operateur>. Donc pas besoin de faire un cast, tu peux directement faire Operateur oe = equipage.get(i)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  21 mai 2012 à 12:53:33

                                  Citation : brubru777

                                  Quand tu fais Operateur e = equipage.get(i) tu "écrases" le e de ta fonction ajouter. Si tu changes son nom (op par exemple), ça devrait marcher.



                                  Non, 'e' à une portée de fonction, il est pas visible de l’extérieur.

                                  Son problème c'est que

                                  Operateur oe = (Operateur) e;
                                  		
                                  if (oe.nom.equals(e.nom))
                                  


                                  revient à dire que oe prend comme valeur e forcément comparer oe et e n'a donc pas beaucoup de sens, la condition sera toujours vérifiée.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    21 mai 2012 à 13:02:32

                                    Merci d'avoir répondu présent les gars surtout brubru77 ;)
                                    Ca m'as vraiment aidé et j'ai appris plein de trucs .
                                    Je laisse le sujet ouvert car je pense qui servira encore.

                                    J'ai réussi en faisant ça :
                                    public void ajouter(Operateur e)
                                    	{
                                    		
                                    		if (equipage.size()>=10)
                                    		{
                                    			System.out.println("WARNING ! === Il y a déja 10 membres d'équipage. ===");
                                    		}
                                    		else if (membreDifferent(e)==false)
                                    		{
                                    			System.out.println("WARNING ! === Ce nom existe déja. ===");
                                    		}
                                    		else 
                                    		{
                                    			equipage.add(e);
                                    			System.out.println("=> "+e.nom+" est à la place "+equipage.size()+" dans le vaisseau "+nom);
                                    			System.out.println("----------- il y a "+equipage.size()+" membres d'equipage.-----------");
                                    		}
                                    	}
                                    	
                                    	public boolean membreDifferent(Operateur e){
                                    		
                                    		for (int i=0;i<equipage.size();i++)
                                    		{
                                    			Operateur oe = equipage.get(i);
                                    		
                                    			if (e.nom.equals(oe.nom))
                                    			{
                                    				return false;
                                    			}
                                    		}
                                    		return true;
                                    	}
                                    
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      21 mai 2012 à 13:52:43

                                      Une dernière chose, dans une condition, mettre
                                      if (quelquechose == true)
                                      

                                      est redondant. Tu peux vérifier que
                                      if (quelquechose)
                                      

                                      produit exactement le même résultat.

                                      De même,
                                      if (quelquechose == false)
                                      

                                      peut être remplacé par
                                      if (!quelquechose) // ! est l'opérateur booléen inverse. !true = false et !false = true
                                      

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      petit problème en java

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                      • Editeur
                                      • Markdown