Java Trier par ordre aplhabétique(compareTo)

Résolu/Fermé
aleben - 24 janv. 2008 à 17:39
 Essayas - 26 nov. 2011 à 11:33
Bonjour,
je commence a programmer en java avec l'école et je dois lire 3 trois chaines de caractères, les comparer avec compareTo, et les afficher à l'écran. J'ai déjà commencer, j'ai déjà fais pour lire les 3 chaines de caractère, mais je ne sais pas comment utiliser compareTo, pouvez-vous m'aidez.

Voici mon bout de code:


import java.util.Scanner;//pour lire les données au clavier
public class CompareString
{
public static void main(String[] args)
{
String chaine1,chaine2,chaine3; // Declaration

// cree un objet Scanner pour lire les donnees.
Scanner keyboard = new Scanner(System.in);
chaine1 = keyboard.nextLine();//lit les données au clavier
chaine2 = keyboard.nextLine();
chaine3 = keyboard.nextLine();



}
}
A voir également:

13 réponses

Bonsoir

En vérifiant mon algo ce soir je me suis rendu compte que dans mon test j avais écrit :

if( pListe.get(i).getNom().compareTo( pListe.get(j).getNom()) > 0 )

a la place de :

if( pListe.get(min).getNom().compareTo( pListe.get(j).getNom()) > 0 )

Donc voici un petit test effectué :

Classe Personnes
import java.util.ArrayList;

public class Personnes 
{
	String Nom;
	Integer Age;
	
	public Personnes(String pNom, Integer pAge)
	{
		Nom = pNom;
		Age = pAge;
	}

	public Integer getAge() 
	{
		return Age;
	}

	public void setAge(Integer age) 
	{
		Age = age;
	}

	public String getNom() 
	{
		return Nom;
	}

	public void setNom(String nom) 
	{
		Nom = nom;
	}
	
	public String Affichage()
	{
		return "Nom :\t" + Nom + "\r\nAge :\t" + String.valueOf(Age) + "\r\n";
	}
	
	public static ArrayList<Personnes> TriAlphabetique(ArrayList<Personnes> pListe)
	{
		Integer i, j, min;
		Personnes temp;
		for(i = 0; i < pListe.size(); i++)
		{
			min = i;
			for(j = i; j < pListe.size(); j++)
			{				
				if(pListe.get(min).getNom().compareTo(pListe.get(j).getNom()) > 0)
				{					
					min = j;
				}
			}
			temp = pListe.get(i);
			pListe.set(i, pListe.get(min));
			pListe.set(min, temp);			
		}
		return pListe;		
	}

}


Programme de test :

import java.util.ArrayList;
import java.util.Iterator;

public class test_triAlphabetique 
{
	public static void main(String[] args) 
	{
		ArrayList<Personnes> listePersonnes = new ArrayList<Personnes>();
		listePersonnes.add(new Personnes("prof2011", 25));
		listePersonnes.add(new Personnes("alt157", 21));
		listePersonnes.add(new Personnes("bisounours", 21));		
		listePersonnes.add(new Personnes("douffi", 21));
		listePersonnes.add(new Personnes("cowboy", 21));
		listePersonnes.add(new Personnes("polo", 23));
		
		Iterator<Personnes> iter = listePersonnes.iterator();
		while(iter.hasNext())
		{
			Personnes tmp = iter.next();
			System.out.println(tmp.Affichage());
		}
		
		System.out.println("\r\n__________________________\r\n");
		
		Personnes.TriAlphabetique(listePersonnes);
		
		iter = listePersonnes.iterator();
		while(iter.hasNext())
		{
			Personnes tmp = iter.next();
			System.out.println(tmp.Affichage());
		}		
	}
}


Cela nous renvoie bien une liste triée par ordre alphabétique :)

Bonne soirée
7
Bonjour à vous,

Si j'ai bien compris le but est de trier une class "Personne" dans l ordre alphabétique...

utilisation du Set (collection java ou conteneur)

Pour cela il suffit de créer une TreeSet dans laquelle on insert les personnes...

Elle sera automatiquement classée par ordre alphabétique a condition que:

*1. La class Personne implémente la class Comparable<Personne>
- public class Personne implements Comparable<Personne>
{
// Description de la class Personne

}


**2. La méthode compareTo de la class Comparable doit être redéfinie dans la class Personne

===> la methode CompareTo sera utilisée par la TreeSet et determinera par quel critères on trie les personnes, age nom etc.. <===

la methode compareTo est complexe et permet de comparer n'importe quel type simple enveloppé dans un objet (Wrapper) et donc même une String... elle retourne un entier qui est l'ecart entre les deux premier caractères différents d'une string. (faite un essai)

La TreeSet se servira de ce résultat pour déterminer l'ordre alphabétique...
par exemple : une redéfinition de compareTo qui tri par :
- Ordre alphabétique
- Age si le nom est le meme
- Attention si il n'y a que ces deux critères et que l'age et le nom sont les même, la TreeSet ne contiendra qu'une fois la personne car elle a la caractéristique de ne pas accepter les doublons...

Exemple:
// compare nom puis si même non compare age

public int compareTo(Personne personne2)
{
int memeNom = this.nom.compareTo(personne2.nom);

if(memeNom == 0)
{
return new Integer(age).compareTo(new Integer(personne2.age));
}

return memeNom;
}


***3. Introduire les instances de Personne dans une TreeMap

Exemple:
Set<Personne> setPersonne = new TreeSet<Personne>();

SetPersonne.add(personne1);
SetPersonne.add(personne2);
SetPersonne.add(personne3);

afficher(SetPersonne);

// affichera dans l'ordre alphabétique et dans l ordre des ages...




Salutations
6
maxmethot Messages postés 168 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 12 octobre 2008 55
24 janv. 2008 à 18:06
Salut aleben !


Essaye ca :

import java.util.Scanner;//pour lire les données au clavier
public class CompareString
{
public static void main(String[] args)
{
String chaine1,chaine2,chaine3; // Declaration

// cree un objet Scanner pour lire les donnees.
Scanner keyboard = new Scanner(System.in);
chaine1 = keyboard.nextLine();//lit les données au clavier
chaine2 = keyboard.nextLine();
chaine3 = keyboard.nextLine();

String temp1, temp2, temp3;

if(chaine1.compareTo(chaine2) > 0 )
{
temp1 = chaine1;
}
else if(chaine1.compareTo(chaine2) < 0 )
{
temp1 = chaine2;
}
else
System.out.print("Les chaines 1 et 2 sont identiques");

if(chaine2.compareTo(chaine3) > 0 )
{
temp2 = chaine2;
}
else if(chaine2.compareTo(chaine3) < 0 )
{
temp2 = chaine3;
}
else
System.out.print("Les chaines 2 et 3 sont identiques");

if(chaine3.compareTo(chaine1) > 0 )
{
temp3 = chaine3;
}
else if(chaine3.compareTo(chaine1) < 0 )
{
temp3 = chaine1;
}
else
System.out.print("Les chaines 3 et 1 sont identiques");

System.out.print("Voici les chaines en ordre alphabétique:\n\n" + temp1+ "\n" + temp2 + "\n" + temp3);
}
}

Tu devrait le tester avant parce que jai écris ca de mémoire.

Au plaisir,
Maxmethot
1
aleben Messages postés 85 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 18 août 2009 18
24 janv. 2008 à 23:29
Merci Maxmethot,
il compile bien mais j'ai un problème il ne s'execute pas, comment ce fait-il??
j'ai fait une ou deux modif:
import java.util.Scanner;//pour lire les données au clavier
public class CompareString
{
public static void main(String[] args)
{
String chaine1,chaine2,chaine3; // Declaration

// cree un objet Scanner pour lire les donnees.
Scanner keyboard = new Scanner(System.in);
chaine1 = keyboard.nextLine();//lit les données au clavier
chaine2 = keyboard.nextLine();
chaine3 = keyboard.nextLine();
String phrase = new String();
phrase = "Error";
String temp1=phrase, temp2=phrase, temp3=phrase;

if(chaine1.compareTo(chaine2) > 0 )
{
temp1 = chaine1;
}
else if(chaine1.compareTo(chaine2) < 0 )
{
temp1 = chaine2;
}
else
System.out.print("Les chaines 1 et 2 sont identiques");

if(chaine2.compareTo(chaine3) > 0 )
{
temp2 = chaine2;
}
else if(chaine2.compareTo(chaine3) < 0 )
{
temp2 = chaine3;
}
else
System.out.print("Les chaines 2 et 3 sont identiques");

if(chaine3.compareTo(chaine1) > 0 )
{
temp3 = chaine3;
}
else if(chaine3.compareTo(chaine1) < 0 )
{
temp3 = chaine1;
}
else
System.out.print("Les chaines 3 et 1 sont identiques");

if(chaine1==phrase || chaine2==phrase || chaine3==phrase)
{
System.out.print("Error");
}
else
System.out.print("Voici les chaines en ordre alphabétique:\n\n" + temp1+ "\n" + temp2 + "\n" + temp3);
}
}

Est-ce normal?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
maxmethot Messages postés 168 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 12 octobre 2008 55
25 janv. 2008 à 04:39
Oui c'est normal parce que ton string phrase est en fait un "objet" string que tu dois comparer en utilisant la méthode Equals plutôt que les == . Remplace ton dernier if par celui ci et re-teste :

if(chaine1.equals(phrase) || chaine2.equals(phrase) || chaine3.equals(phrase))


En passant, tu n'a pas besoin de dire a ta string que tu la déclare en objet :

String phrase = new String();
phrase = "Error";

Tu peux tout simplement lui dire :

String phrase = "Error";

et le compilateur comprendra que c'est un objet de type string automatiquement.

Ah oui, également, fais attention: tu lance une condition qui va vérifier si la chaine1,2 ou 3 est égale à "Error", mais nulle part dans le programme tu dis à ces chaine de prendre la valeur "Error", ce qui fait en sorte que cette condition retournera toujours la valeur "False" et donc n'exécutera jamais le code à l'intérieur de la condition. Je ne sais pas exactement qu'est-ce que tu essayais de tester avec cette condition, mais je peux te confirmer que présentement, elle ne te sert littéralement à rien. Tu pourrais l'enlever et il n'y aurait pas de différence.

En espérant t'avoir éclairé un peu,
N'hésite pas si tu as d'autres questions,
Au plaisir,
Maxmethot
0
Maxmethot,
j'ai remis la version que tu m'avais dit en premier mais il ne s'execute pas, il compile et quand je l'exécute il ne se passe rien
0
maxmethot Messages postés 168 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 12 octobre 2008 55
27 janv. 2008 à 06:17
Quel IDE utilise tu ?!

Eclipse, NetBeans ?!

As tu des messages d'erreurs dans la console ?! Si oui, poste les ici.

maxmethot
0
Bonjour,
j'utilise NetBeans et quand je le compile il ne me met aucune erreur c'est quand il met running en bas a droite que la ça dure tellement longtemps que c'est anormal et je n'ai jamais de résultat même est le laissant tourner plus de 3 minutes.

aleben
0
soufian1364 Messages postés 41 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 23 mai 2016 4
21 févr. 2008 à 23:39
Bonjour eleben, Bonjour maxmethot, Bonjour à tous,

d'abors, j'aimerais vous remercier pour ce sujet, cette question,
et personnelement je vous propose ma résolution (toujour dans le même probleme) :


import java.io.*;
public class ComparaisonDeTroixString {
public static void main (String [] args)throws IOException {
BufferedReader clavier=new BufferedReader (new InputStreamReader (System.in));
String a,b,c,temp1="", temp2="", temp3="";
System.out.println("Veuillez saisir troix mots");
a=clavier.readLine();
b=clavier.readLine();
c=clavier.readLine();

if ((a.compareTo(b)>0) && (a.compareTo(c)>0)) { // si( a>b et a>c )
temp1=a;
if (b.compareTo(c)>0){
temp2=b;
temp3=c;
}
else {
temp2=c;
temp3=b;
}
}

if ((b.compareTo(a)>0) && (b.compareTo(c)>0)) { // si( b>a et b>c )
temp1=b;
if (a.compareTo(c)>0){
temp2=a;
temp3=c;
}
else {
temp2=c;
temp3=a;
}
}

if ((c.compareTo(a)>0) && (c.compareTo(b)>0)) { // si( c>a et c>b )
temp1=c;
if (a.compareTo(b)>0){
temp2=a;
temp3=b;
}
else {
temp2=b;
temp3=a;
}
}

System.out.println("Le bon tri est :"+temp3+" puis "+temp2+" puis "+temp1);

}
}
0
aleben Messages postés 85 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 18 août 2009 18
14 mars 2008 à 00:31
Merci à tous pour vos réponses
0
prof2011 Messages postés 8 Date d'inscription mercredi 11 mars 2009 Statut Membre Dernière intervention 7 août 2009
2 août 2009 à 23:20
bonjour soufian1364 et Bonjour à tous je m'appel zeid et je voudrer savoir comment on peut generaliser tri par
orde alphabetique

sur un tableau de plusieur objet personne
0
Bonjour tout le monde,

@prof2011 : Tu peux créer une méthode statique dans ta Classe Personne par exemple :

public ArrayList<Personnes> TriAlphabetique(ArrayList<Personnes> pListe)
{}

Cette méthode pourra comporter un simple algorithme de tri du genre :

public ArrayList<Personnes> TriAlphabetique(ArrayList<Personnes> pListe)
{
for (int i = 0; i < pListe.size(); i++)
{
int min = i;
for( int j = i ; j < pListe.size(); j++)
{
if( pListe.get(i).getNom().compareTo( pListe.get(j).getNom()) > 0 )
{
min = j
}
}
Personnes tmp = pListe.get(i);
pListe.set(i, pListe.get(j));
pListe.set(min, tmp);
}
return pListe;
}

(pas testé je l ai fait de tete vu que je n ai pas de machines avec Java sous la main mais tu as l idée général ainsi)
0
Pour l entete de la méthode ce n est pas :

public ArrayList<Personnes> TriAlphabetique(ArrayList<Personnes> pListe)

je me suis trompé j ai oublié le mot static ce qui donne :

public static ArrayList<Personnes> TriAlphabetique(ArrayList<Personnes> pListe)
0
prof2011 Messages postés 8 Date d'inscription mercredi 11 mars 2009 Statut Membre Dernière intervention 7 août 2009
7 août 2009 à 14:21
Bonjour tout le monde,

alt157 : merci ce claire
et merci pour la rectification!!
0
prof2011 Messages postés 8 Date d'inscription mercredi 11 mars 2009 Statut Membre Dernière intervention 7 août 2009
7 août 2009 à 14:37
salut alt157
il y a une message d'erreur comme ceci

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:840)
at java.util.Scanner.next(Scanner.java:1461)
at java.util.Scanner.nextInt(Scanner.java:2091)
at java.util.Scanner.nextInt(Scanner.java:2050)
at personne_comparaison.Main.main(Main.java:26)
Java Result: 1
0