Tri par ordre lexicographique [Résolu/Fermé]

Signaler
-
Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
-
Bonjour,

Je suis débutant en java et j'essaye en ce moment de trier un tableau de string par ordre lexicographique. J'ai essayer avec compareTo,.. mais pas moyen de compiler.
J'essaye en fait de faire une procédure d'un programme plus grand mais je bloque sur ce morceau du puzzle. Si vous avez des conseils, des idées,.. N'hésitez par à partager :)


Voici un exemple de ce que je veux trier:

String achat[]=new String[10];
		achat[0] = "coca";
		achat[1] = "shampoing";
		achat[2] = "cocaa";
		achat[3] = "yahourt";
		achat[4] = "b";
		achat[5] = "zertyucoca";
		achat[6] = "DANETTE";
		achat[7] = "coca";
		achat[8] = "choco";
		achat[9] = "lait";

3 réponses


Merci encore kx :) décidément tu fais tourner toute la catégorie d'aide en programmation a toi tout seul ^^

Re encore un problème. j'essaye de transformer des morceau de mes programme en procédure mais tout ne passe pas...
Ces les 1er procédure que je crée donc j'ai s'en doute fait une bête erreur.
Merci d'avance :)

import java.util.Scanner;


	//cette procedure prend 2 string et vérifie qu'il soit différent et ne contiennent qu'une lettre 
	public static boolean proc_x_y(String x, String y) {
	boolean bon = false;
	if (x.length() == 1 & y.length() == 1)
		if(x.charAt(0) != y.charAt(0)) bon = true;
	 return(bon);}

	
	
	
	public static boolean valider(StringBuffer course, char[]var1,char[]var2){
		char test;
		int cpt = 0;
		boolean fermeture = false;
		while (cpt < course.length()) 
		{
			test = course.charAt(cpt); 
			if (test == var1[0] || test == var2[0])
			{
				System.out.print("Fin du marché");
				fermeture = true;
				cpt = course.length();
			}
			
			cpt ++;
		
			if (fermeture == false && cpt == course.length())
			{
				System.out.print("Produit valider");
			}
		}
	cpt = 0;
	return(fermeture);}
		
	

	
	public static void main(String[] args) {
		
		System.out.println("Entrer vos paramètres (1 lettre par paramètre) ");
		boolean bon = false;
		String x;
		String y;
		
		Scanner clavier = new Scanner(System.in);
		do {
		System.out.println("Entrez x: ");
		x = clavier.nextLine();
		System.out.println("Entrez y: ");
		y = clavier.nextLine();
		
		bon = proc_x_y(x,y);  //utiliser la procédure bon_x_y
		} while (bon == false);
		
		x = x.toLowerCase();
		y = y.toLowerCase();

		char[] var1 = x.toCharArray();
		char[] var2 = y.toCharArray();
		
		System.out.println("Bienvenue au marché de Pad"+x+"pad"+y);
		
		System.out.println("Faite vos course, N'entrez pas de maj et de mot contenant les lettres contenu dans vos paramètre.");
		System.out.println("Entrez des mots jusqu'à ce que vous ayez une faute.");

		
		
		boolean fermeture = false ;
		
		while (fermeture == false)
		{
		StringBuffer course = new StringBuffer(clavier.nextLine()); 
		
			fermeture = valider(course,var1,var2);
		}
	}
}
Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 856
Tu as mis un & sur ta condition (x.length() == 1 & y.length() == 1), or il faut utiliser && comme ça :
x.length() == 1 && y.length() == 1
Tu peux te passer de ta variable "bon" et même du if en faisant directement un return.
De plus n'oublie pas de tester si x et y sont null sinon ton programme risque de planter quand tu utilises la méthode length. De manière générale, il faut toujours penser à tous les cas possibles.
Enfin, donne un nom compréhensible à tes méthodes (en Java on ne parle pas de fonction ou procédure, mais bien de méthodes) en respectant les conventions de nommage (les _x_y ne sont pas conventionnels) et penses à documenter ton code.

/**
 * Testes deux String pour vérifier qu'elles sont de taille 1 et que leur unique caractère est différent.
 * @param x la première chaîne à tester
 * @param y la deuxième chaîne à tester
 * @return true si toutes les conditions sont vérifiées, false sinon
 */
 public static boolean haveDifferentChar(String x, String y)
{
    return x!=null && y!=null && x.length()==1 && y.length()==1 && x.charAt(0)!=y.charAt(0);
}

Je te laisse continuer réfléchir à la suite de tes méthodes, mais quelques conseils : décomposes ton code en méthodes courtes, qui ne font qu'une seule chose à la fois, mais qui le font bien, c'est à dire en gérant tous les cas possibles.
Messages postés
16372
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
23 juillet 2021
2 856
Tu as des méthodes utiles dans la classe Arrays :

import java.util.Arrays;

public class Main 
{
public static void main(String[] args)
{
	String achat[] = {"coca", "shampoing", "cocaa", "yahourt", "b", "zertyucoca","DANETTE", "coca", "choco", "lait"};
	System.out.println(Arrays.toString(achat));
	Arrays.sort(achat);
	System.out.println(Arrays.toString(achat));
}
}

Remarque : l'ordre lexicographique en Java signifie l'ordre des caractères UTF-16. Pour l'ordre alphabétique il faut s'y prendre autrement, en implémentant un Comparator :

Arrays.sort(achat,new Comparator<String>()
{
    @Override
    public int compare(String str1, String str2) 
    {
        int x = str1.compareTo(str2); // comportement par défaut
        return x; // x<0 si str1<str2, x==0 si str1==str2, x>0 si str1>str2
    }
});