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

API standards et tierces Java Discussion :

Modification de compareTo pour des String?


Sujet :

API standards et tierces Java

  1. #1
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 85
    Points : 64
    Points
    64
    Par défaut Modification de compareTo pour des String?
    Bonjour à tous,

    J'ai une petite interrogation... J'aimerais modifier la classe compareTo pour
    trier des objets à partir d'un attribut String. Je l'ai déjà fais pour trier des
    objets sur un attribut int:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            //Méthode pour comparer les entités par code postal
    	public int compareTo(Object Villes)
    	{
            int nombre1 = ((Villes) Villes).getCodePostal(); 
            int nombre2 = this.getCodePostal(); 
     
            if (nombre1 > nombre2)  return -1; 
     
            else if(nombre1 == nombre2) return 0; 
     
            else return 1;
        }
    Seulement voilà je n'arrive pas à le faire pour une chaine String, et pourtant
    j'ai essayé, croyez moi.

    Quelqu'un pourrait-il me tuyauter?

  2. #2
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par Greg.shogun
    Bonjour à tous,

    J'ai une petite interrogation... J'aimerais modifier la classe compareTo pour
    trier des objets à partir d'un attribut String. Je l'ai déjà fais pour trier des
    objets sur un attribut int:

    Seulement voilà je n'arrive pas à le faire pour une chaine String, et pourtant
    j'ai essayé, croyez moi.

    Quelqu'un pourrait-il me tuyauter?
    C'est quoi exactement ton problème ? Qu'as-tu déja fait ?

  3. #3
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 85
    Points : 64
    Points
    64
    Par défaut
    Et bien j'ai essayé en reprenant la structure de mon message suivant et
    en le modifiant pour que la classe travaille avec des chaines String.

    Mais apparement c'est le fait de comparer des chaines de caractères dans
    la classe compareTo elle même qui pose problème. Alors si quelqu'un a
    déjà fait en sorte que Arrays.sort() trie sur un attribut String déterminé
    par la classe compareTo... Ca serait bien gentil de sa part de me donner
    un coup de pouce.

    Pour le moment voici mon prog:
    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
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
     
    import java.util.*;
     
    /*-------------------->>Classe contenant la méthode main<<-------------------*/
    public class TestLabo8
    {
    	public static void main(String[] args)
    	{
    	   	Villes city[]=new Villes[6];
     
    	   	//Initialisation du tableau city dans le désordre
    	   	city[0]=new Villes("La Louvière","Belgique",7100);
    	   	city[1]=new Villes("Kinshasa","Congo",3347);
    	   	city[2]=new Villes("Detroit","USA",4929);
    	   	city[3]=new Villes("Anvers","Belgique",2000);
    	   	city[4]=new Villes("Houston","USA",7024);
    	   	city[5]=new Capital("Bruxelles","Belgique",1000);
     
    	   	//Ajout de quelques entités pour La Louvière dans le désordre
    	   	city[0].addAntite("Houdeng",7110);
    	   	city[0].addAntite("Strépy",7113);
    	   	city[0].addAntite("Boussoit",7112);
    	   	city[0].addAntite("Maurage",7111);
    	   	city[0].addAntite("Besonrieux",7114);
     
    	   	//Ajout de quelques entités pour Bruxelles dans le désordre
    	   	city[5].addAntite("Ixelles",1050);
    	   	city[5].addAntite("Etterbeek",1040);
    	   	city[5].addAntite("Laeken",1020);
     
    	   	//Triage sur le pays et affichage
    	   	Arrays.sort(city);
     
    	   	for(int i=0;i<6;i++)
    	   	{
    	   		city[i].affichePlace();
    	   	}
     
     
    	}
     
    }
     
    /*----------------------------->>Classe Villes<<-----------------------------*/
    class Villes implements Comparable
    {
    	protected String nomVille,pays;
    	protected int codePostal;
    	protected Vector antites;
     
    	//Premier constructeur de la classe Villes
    	public Villes(String a,int b)
    	{
    		nomVille=a;
    		codePostal=b;
    		pays=null;
    	}
     
    	//Deuxième constructeur de la classe Villes	
    	public Villes(String a,String b,int c)
    	{
    		nomVille=a;
    		pays=b;
    		codePostal=c;
    		antites=new Vector();
    	}
     
    	//Méthode pour comparer les entités par code postal
    	public int compareTo(Object Villes)
    	{
            int nombre1 = ((Villes) Villes).getCodePostal(); 
            int nombre2 = this.getCodePostal(); 
     
            if (nombre1 > nombre2)  return -1; 
     
            else if(nombre1 == nombre2) return 0; 
     
            else return 1;
        }    
     
     
     
     
    	//Méthode renvoyant le code postale d'une ville
    	public int getCodePostal()
    	{
    		return codePostal;
    	}
     
    	//Méthode retournant le nom d'une ville
    	public String getNomVille()
    	{
    		return nomVille;
    	}
     
    	//Méthode affichant un objet Villes + Tri des entités
    	public void affichePlace()
    	{
    		System.out.println("Nom ville: "+nomVille);
    		System.out.println("**********");
    		System.out.println();
    		System.out.println("--->Code postal: "+codePostal);
    		System.out.println("--->Pays: "+pays);
    		if(antites.size()!=0)
    		{
    			int taille=antites.size();
    			Villes temp;
    			Collections.sort(antites);
    			System.out.println("--->Entites: ");
    			for(int i=0;i<taille;i++)
    			{
    				temp=(Villes)antites.get(i);
    				System.out.println("         -  "+temp.getCodePostal()+" "+temp.getNomVille());
    			}
    		}
    		System.out.println();
    	}
     
    	//Méthode ajoutant un objet Villes au Vector antités
    	public void addAntite(String a,int b)
    	{
    		Villes ant=new Villes(a,b);
    		antites.addElement(ant);
    	}
     
    	//Méthode supprimant tous les objets du Vector antités
    	public void deleteAntites()
    	{
    		antites.clear();
    	}
    }
     
    /*-------------->>Classe Capital dérivant de la classe Villes<<--------------*/
    class Capital extends Villes
    {
    	private char capital;
     
    	//Constructeur de la classe Capital
    	public Capital(String a,String b,int c)
    	{
    		super(a,b,c);
    		capital='*';
    	}
     
    	//Méthode affichant un objet Capital
    	public void affichePlace()
    	{
    		System.out.println("Nom ville: *"+nomVille);
    		System.out.println("**********");
    		System.out.println();
    		System.out.println("--->Code postal: "+codePostal);
    		System.out.println("--->Pays: "+pays);
    		if(antites.size()!=0)
    		{
    			int taille=antites.size();
    			Villes temp;
    			Collections.sort(antites);
    			System.out.println("--->Entites: ");
    			for(int i=0;i<taille;i++)
    			{
    				temp=(Villes)antites.get(i);
    				System.out.println("         -  "+temp.getCodePostal()+" "+temp.getNomVille());
    			}
    		}
    		System.out.println();
    	}
    }
    J'aimerai que Array.sort() trie sur nomVille. Mais je n'y arrive pas.

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Greg.shogun
    J'aimerai que Array.sort() trie sur nomVille. Mais je n'y arrive pas.
    Tu peux utiliser un Comparator avec Arrays.sort() afin de spécifier un autre ordre...

    a++

  5. #5
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    C'est ca qui te pose probleme? ou je n'ai pas compris??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public int compareTo(Object v)
    	{
            String v2 = ((Villes)v).getNomVille(); 
            String v1 = this.getNomVille(); 
     
            return v1.compareTo(v2);
        }
    Ou sinon utilise Comparator avec Arrays.sort(). (je te le conseille tout comme Greg.shogun)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //Triage sur le pays et affichage
    	   	Comparator<Villes> comparateur = new Comparator<Villes>(){
    	   		public int compare(Villes v1, Villes v2){
    	   			String nom1 = v1.getNomVille();
    	   			String nom2 = v2.getNomVille();
    	   			return nom1.compareTo(nom2);
    	   		}
    	   	};
    	   	Arrays.sort(city, comparateur);
    Voilà si tu n'arrives pas avec ca, c'est pas normal!

  6. #6
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    A noter que si tu met la methode compareTo(Object v).... dans la classe Ville, dnas le comparateur tu peux l'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Comparator<Villes> comparateur = new Comparator<Villes>(){
    	   		public int compare(Villes v1, Villes v2){
    	   			return v1.compareTo(v2);
    	   		}
    	   	};

    A noter aussi qu'aucun test n'est réaliser dans la méthode compareTo pour une ville, il y a un cast en Ville, mais si l'Object n'est pas une "Ville" ca plantera (bien sur Capital hérite de Ville donc ca ne plante pas)

  7. #7
    Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 85
    Points : 64
    Points
    64
    Par défaut
    Ok. Merci beaucoup pour votre aide précieuse!

    Sinon j'ai modifier le code pour qu'il fonctionne dans mon programme.
    Voici comment je l'ai redéfini:
    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
     
    //Redéfinition de compareTo(Pour tri sur nom)
    	public int compareTo(Object Membres)
    	{
    		int longChaine1,longChaine2,compteur,flag=0,rep=0;
            String chaine1 = ((Membres) Membres).getNom(); 
            String chaine2 = this.getNom();
     
            longChaine1=chaine1.length();
            longChaine2=chaine2.length();
            if(longChaine1!=longChaine2)
            {
            	if(longChaine1>longChaine2)
            	{
            		compteur=longChaine2;
            	}
            	else
            	{
            		compteur=longChaine1;
            	}
            } 
            else
            {
            	compteur=longChaine1;
            }
     
            char car1[]=new char[compteur];
            char car2[]=new char[compteur];
            int i=0;
            do
            {
            	car1[i]=chaine1.charAt(i);
            	car2[i]=chaine2.charAt(i);
            	if(car1[i]!=car2[i])
            	{
            		if (car1[i] > car2[i])
            		{
            			rep=(-1); 
            		} 
            		else
            		{ 
            		    rep=1;
            		}
            		flag=1;
            	}
            	i++;
            }while(flag==0&&i<compteur);
     
            return rep;
        }
    Ce n'est peut être pas la façon la plus professionnelle de faire cette
    comparaison mais ayant fais du langage C avant d'apprendre le Java
    j'ai gardé quelques mauvaises habitudes. lol

    Donc on peut dire que ce sujet est résolu.
    Encore un grand merci à tous!

  8. #8
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    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
    if(longChaine1!=longChaine2)
            {
            	if(longChaine1>longChaine2)
            	{
            		compteur=longChaine2;
            	}
            	else
            	{
            		compteur=longChaine1;
            	}
            } 
            else
            {
            	compteur=longChaine1;
            }
    Tu peux optimiser ton code en enlevant le premier si, qui ne sert à rien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(longChaine1>=longChaine2)
            	{
            		compteur=longChaine2;
            	}
            	else
            	{
            		compteur=longChaine1;
            	}
    De plus je ne sais pas dans ton cas, mais normalement 2 chaines n'ayant pas la meme longueur (après avoir supprimé les espaces) ne sont pas identique.
    Donc ton "si" servirait si tu renvoyait faux si la longueur était differente.
    Et que tu faisais le test dans l'autre cas. Mais je trouve un petit peu bete de ne pas utiliser la methode compareTo de la classe String car la en gros tu l'as réécrite à ta facon, lol!

    Bref si ce n'est juste pour avoir un truc qui marche chez toi et que tu ne veux pas t'embeter plus et bien si ca marche c'est toi que ca regarde, lol!
    Mais sinon un code optimiser est mieux surtout pour la maintenance!

Discussions similaires

  1. Modification de fonction pour passer des arguments via l'url
    Par dl_jarod dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 20/06/2008, 12h05
  2. Modification des String dans un tableau par référence
    Par koukoula dans le forum Windows Forms
    Réponses: 13
    Dernier message: 06/06/2008, 15h29
  3. Fonction "contains" pour des String
    Par Gaaaga dans le forum Flex
    Réponses: 1
    Dernier message: 27/05/2008, 14h16
  4. Quel parseur XML pour des Strings ?
    Par krokmitaine dans le forum XML
    Réponses: 13
    Dernier message: 19/12/2006, 21h01
  5. [C#] Comment coder un String.Join pour des int ?
    Par luimême dans le forum C#
    Réponses: 2
    Dernier message: 12/10/2005, 08h14

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