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 :

Probleme avec toCharArray()


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 47
    Par défaut Probleme avec toCharArray()
    Bonjour!
    Je suis coulane débutant en java.
    j'essai d'ecrire un programme pour classer par ordre alphbetique une liste de noms et je crois que j'ai un probleme avec "toCharArray()", en fait j'ai testé les autres morceaux de mon code et le probleme semble venir de la methode Ordonner qui est censé ordonner deux noms.
    Merci de m'aider et à tres bientot j'espere!
    voici mon 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
    public class TriChaine {
    		/**
                     * @param args
                     */
    		public static void main(String[] args) {
    			// TODO Auto-generated method stub
    String[] tab={"toto" ,"tata","tati","tatilo"};
    do{
    	for (int i=0;i<tab.length-2;i++){
    		if(Ordonner(tab[i],tab[i+i])==false)
     
    			Permute(tab,i);
    	                                }//Fin for i
      }while(ListeOrdonner(tab)==false);
    Afficher(tab);
    		}//fin main
    		static boolean Ordonner(String ch1,String ch2){
    			char[] carac1 = ch1.toCharArray();
    			char[] carac2 = ch2.toCharArray();
    for (int i=0;i<carac1.length-1;i++){
    	if (carac1[i]<carac2[i])
    			return false;
    }	// Fin for;
    			return true;
    }//Fin Ordonner ;
    		static void Permute(String[] tab, int i){
    			String C;
    			C=tab[i];
    			tab[i]=tab[i+1];
    			tab[i+1]=C;
    		}//Fin Permute
    	static void Afficher (String[] tab){
    	for(String str:tab)
    		System.out.println(str);
    }// Fin Afficher
    	static boolean ListeOrdonner(String[] tab){
    		for (int i=0;i<tab.length-2;i++){
    			if(Ordonner(tab[i],tab[i+1])==false)
    				return false;
    		}
    		return true;
    	}// fin ListeOrdonner
     
    }

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Pour classer des String, le plus simple est Arrays.sort() ou Collections.sort(). Mais bon, l'exercice est intéressant.

    Tu as l'air d'accuser la méthode toCharArray(). Pourquoi ? Elle fait quelque chose qui ne te plaît pas ?

    Nous ne devrions pas lire ton programme et le corriger sans que tu n'étudies par toi-même les morceaux pour vérifier qu'ils sont corrects. Si tu as des vraies questions précises, nous pourrons y répondre. Rien ne me choque dans ton utilisation de toCharArray(), à part le fait que tu pourrais aussi bien faire charAt() et les récupérer un par un. Mais peu importe ça. Si tu n'es pas sûr à propos de quelque chose de toCharArray(), eh bien essaie, ce n'est pas compliqué. Et si tu veux nous demander, explique-toi, au moins.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 47
    Par défaut
    Merci thelvin
    au fait j'ai testé les methodes Permute et Afficher qui fonctionnent bien.Seulement en testant la methode Ordonner voilà ce que j'obtient:


    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
    public class EssaieOrdonner {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    				String[] tab={"toto" ,"tata"};
    			if(Ordonner(tab[0],tab[1])==true)
    				System.out.println("liste ordonnee");
    			else
    				System.out.println("liste non ordonnee");	
    			}// fin main
    			static boolean Ordonner(String ch1,String ch2){
     
    				char[] carac1 = ch1.toCharArray();
    				char[] carac2 = ch2.toCharArray();
    		for (int i=0;i<carac1.length-1;i++){
    		if (carac1[i]<carac2[i])
    				return false;
    		      }	// Fin for;
    				return true;
    		      }//Fin Ordonner ;
     
    	}
    et voilà le résultat que j'obtient:

    liste ordonnee

    ce qui me parait erroné puisque dans l'ordre alphabétique tata vient avant toto.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Oui d'accord, mais... Oh et puis zut, tiens. Le problème n'est pas avec toCharArray() ni avec ta façon de t'en servir.

    Le problème, c'est que tu compares carac1[i]<carac2[i] ... Et c'est tout. Il se passe quoi si carac1[i] est un 'B' et carac2[i] est un 'A' ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ta méthode ordonner a un problème c'est que si la string ch1 a plus de caractères que la string ch2, t'aura une exception.

    Ensuite tu ne teste jamais le dernier caractère et ta logique est suspecte


    comparaisons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    t < t -> false
    o < a -> false
    t < t -> false
    donc on retourne true

  6. #6
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    bien que ça ne soit pas la question : attention si on veut être pointilleux l'ordre alphabétique ne peut pas tout à fait se calculer à partir des codes unicode des caractères..... mais pour des petits exercices ça n'a pas d'importance

  7. #7
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 47
    Par défaut
    Merci à tous!
    Citation Envoyé par tchize_ Voir le message
    ta méthode ordonner a un problème c'est que si la string ch1 a plus de caractères que la string ch2, t'aura une exception.

    Ensuite tu ne teste jamais le dernier caractère et ta logique est suspecte
    Au fait tu as raison tchize les strings ch1 et ch2 n'ont pas forcément la même longueur
    j'ai essayé d'en tenir compte en modifiant mon code idem pour le dernier caractère; et ma méthode Ordonner semble marcher.Seulement en l'utilisant dans ma classe TriChaine1(voir ma nouvellle classe) voilà le message d'erreur que j'obtiens:

    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
    public class triChaine1 {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		String[] tab={"toto" ,"tata","tati","tatalo"};
    		do{
    			for (int i=0;i<tab.length-1;i++){
    				if(Ordonner(tab[i],tab[i+i])==false)					
    					Permute(tab,i);
    			                                }//Fin for i
    		  }while(ListeOrdonner(tab)==false);
    		Afficher(tab);
    				} //fin main
    	/*
    	 * ----------------------------------------------------------
    	 */
    /* Cette méthode prend en parametre deux strings et renvoie
    true si les deux chaines sont alphabétiquement ordonnée;
     false sinon.
    	--------------------------------------------------------------
    	*/
    static boolean Ordonner(String ch1,String ch2){
     
    		char[] carac1 = ch1.toCharArray();
    		char[] carac2 = ch2.toCharArray();
       if(carac1.length>carac2.length){
          for (int i=0;i<carac1.length-1;i++){
          if (carac1[i]<carac2[i])
    		return true;
          }	// Fin for;
    		return false;
     
    	                            }// fin if
    	else{
    		for (int i=0;i<carac2.length-1;i++){
    		if (carac1[i]<carac2[i])
    					return true;
    			      }	// Fin for;
    					return false;
    	    }// fin else
        	}// fin Ordonner
    /*
    ---------------------------------------------------------------------
    Cette methode prend en parametre un tableau de string et
    permute sous condition deux chaines consecutives
    ---------------------------------------------------------------------
    */
     
    				static void Permute(String[] tab, int i){
    					String C;
    					C=tab[i];
    					tab[i]=tab[i+1];
    					tab[i+1]=C;
    				}//Fin Permute
    /*
    * ------------------------------------------------------------
    * * Cette methode affiche un tableau de string
    * -------------------------------------------------------------
    */
    			static void Afficher (String[] tab){
    			for(String str:tab)
    				System.out.println(str);
    		}// Fin Afficher
    /*
     * --------------------------------------------------------------
     * Cette methode prend en parametre un tableau de strings 
     * et vérifie  si elle est alphabétiquement ordonnée
     * -----------------------------------------------------------------
     */
    			static boolean ListeOrdonner(String[] tab){
    				for (int i=0;i<tab.length-1;i++){
    					if(Ordonner(tab[i],tab[i+1])==false)
    						return false;
    				}
    				return true;
    			}// fin ListeOrdonner
     
    	}
    Message d'erreur:
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
    at triChaine1.main(triChaine1.java:11)

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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