Tri : mystere a résoudre

Résolu
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 4 mars 2009 à 18:48
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 5 mars 2009 à 07:49
Bonjour a tous et merci a tout ceux qui auront le courage de lire ce message parce que le code va etre un peu long, je m'en excuse.
Voila, j'essaye de trier des cartes par un algorithme d'insertion, j'ai vérifié toutes mes fonctions de comparaison de cartes et elles ont l'air de fonctionner, je ne comprends vraiment pas ce qui se passe et, sans exegérer, je cherche une solurion depuis 15h30 ! ! c'est pourquoi je fais appel a vous...

Un paquet de cartes est un arraylist d'objets Carte.
On trie les cartes de la maniere suivante
d'abord par couleur puis par valeur, puis enfin par forme

je vous donne mon code

<hr size="2" width="100%" />
public enum Symbole {
    maison,
    ballon,
    etoile,
    fanion,
    arbres;
    public static int NBR_SYMBOLE=Symbole.values().length;

    public static int getNBR_SYMBOLE() {
        return NBR_SYMBOLE;
    }

    public static void setNBR_SYMBOLE(int nbr_symbole) {
        NBR_SYMBOLE = nbr_symbole;
    }

    public String toString() {
        int num=0;
        String res="";
        Symbole[] tableauSymbole=Symbole.values();
        for(int i=0;i<NBR_SYMBOLE;i++){
            if(this==tableauSymbole[i]){
                num=i;
            }
        }
        switch(num){
        case 0: res+="maison";
        break;
        case 1: res+="ballon";
        break;
        case 2: res+="etoile";
        break;
        case 3: res+="fanion";
        break;
        case 4: res+="arbres";
        break;
        }
        return res;
       
    }
   
    public boolean formeInferieure(Symbole forme2){
        boolean inferieur;
        inferieur=((this.toString()).compareTo(forme2.toString())<0);
        return inferieur;
    }

   
}

<hr size="2" width="100%" />public class Carte {
// ICI J'AI LE CONSTRUCTEUR, GETTER....

public boolean couleurInferieure(Color c1, Color c2){
        boolean estInferieure=(toStringCouleur(c1).compareTo(toStringCouleur(c2))<0);
        return estInferieure;

/**
     * Cette fonction compare la carte courante a la carte en parametre
     * @param carte2 : carte à laquelle nous allons comparer la carte courante
     * @return : on retourne Vrai si la carte courante est inférieure a la carte en parametre
     */
    public boolean estInferieure(Carte carte2){
        boolean inferieure=false;
        // Si une carte Vide est inférieure a toute carte
        if (this.isVide()==true){
            inferieure=true;
        }
        // On commence a trier les cartes par couleur
        // Si le booleen si dessous est vrai alors, on sait que les couleurs ne sont pas égales
        // en effet, l'inégalité dans la définition du booleen de la fonction précédente est stricte
        if (couleurInferieure(this.getCouleur(), carte2.getCouleur())){
            inferieure=true;
        }
        else {
            if(this.getCouleur().equals(carte2.getCouleur())){
                // Dans ce cas, les cartes ont la même couleur
                // On va donc les comparer par valeur
                if(this.getValeur()<carte2.getValeur()){
                    inferieure=true;                   
                }
                else {
                    if (this.getValeur().equals(carte2.getValeur())){
                        //Dans ce cas, les cartes ont même couleurs, même valeurs
                        //On les compare par forme
                        if (this.getForme().formeInferieure(carte2.getForme())){
                            inferieure=true;
                        }
                        else{
                            if(this.getForme().equals(carte2.getForme())){
                                inferieure=true;
                            }
                        }
                    }
                }
            }
        }
        return inferieure;
    }

<hr size="2" width="100%" />
public class PaquetCarte extends ArrayList<Carte> {
public void ajoutCarte(int j, Carte carte){
        ArrayList<Carte> ListeTemp = new ArrayList<Carte>();
        int N=this.size();
        if (N==j){
            this.add(N,carte);
        }
        else {
            for(int k=j;k<N;k++){
                ListeTemp.add(this.get(k));
            }
            this.removeRange(j, N);
            for(int p=0;p<N-j;p++){
                this.add(j+p,ListeTemp.get(p));
            }
        }
    }

    public PaquetCarte triParInsertion(){
        PaquetCarte paquetTrie;
        PaquetCarte paquetNonTrie;
        int nombreDeCartes;
        int j;
        Carte carte;
        paquetNonTrie=new PaquetCarte("Paquet Non Trie");
        paquetNonTrie.addAll(this);
        nombreDeCartes=paquetNonTrie.size();
        paquetTrie = new PaquetCarte("Paquet Trie");

        paquetTrie.add(0,paquetNonTrie.remove(0));

        for(int i=1; i<nombreDeCartes;i++){
            j=0;
            carte=paquetNonTrie.remove(0);
            while(j<paquetTrie.size() && !carte.estInferieure(paquetTrie.get(j))){
                j++;
            }
            // j est la position a laquelle dois se trouver la carte
            // on va décaler toutes les cartes après j

            paquetTrie.ajoutCarte(j, carte);

        }
        System.out.println(paquetTrie.size());
        return paquetTrie;   

    }

Si ce message est lu, c'est que vous etes arrivé au bout du code et je vous remercie

6 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
4 mars 2009 à 20:18
Salut,

Tu ferais mieux de faire implémenter ta classe Carte de comparable, et de surcharger la fonction compareTo, ainsi tu n'a plus qu'à te soucier de comment comparer 2 cartes, pour l'algorithme de tri, tu pourras alors laisser la fonction Collections.sort s'en charger.

Par exemple (de tête, pas sûr que la syntaxe soit bonne) :

public class Carte implements Comparable {
public Integer compareTo(Carte carte2){
      
       boolean inferieure=false;
        // Si une carte Vide est inférieure a toute carte
        if (this.isVide()==true){
            inferieure=true;
        }
        // On commence a trier les cartes par couleur
        // Si le booleen si dessous est vrai alors, on sait que les couleurs ne sont pas égales
        // en effet, l'inégalité dans la définition du booleen de la fonction précédente est stricte
        if (couleurInferieure(this.getCouleur(), carte2.getCouleur())){
            inferieure=true;
        }
        else {
            if(this.getCouleur().equals(carte2.getCouleur())){
                // Dans ce cas, les cartes ont la même couleur
                // On va donc les comparer par valeur
                if(this.getValeur()<carte2.getValeur()){
                    inferieure=true;                   
                }
                else {
                    if (this.getValeur().equals(carte2.getValeur())){
                        //Dans ce cas, les cartes ont même couleurs, même valeurs
                        //On les compare par forme
                        if (this.getForme().formeInferieure(carte2.getForme())){
                            inferieure=true;
                        }
                        else{
                            if(this.getForme().equals(carte2.getForme())){
                                inferieure=true;
                            }
                        }
                    }
                }
            }
        }
        if (inferieure) {
            return -1;
       } else {
            return 1;
       }
    }

Et pour trier :
taListeDeCarteTriee = Collections.sort(taListeDeCarteNonTriee);
______________________________________
DarK Sidious
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 mars 2009 à 20:21
Je le ferais bien mais je ne peux pas parce que mon sujet de TP m'impose la démarche
Merci quand meme
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 mars 2009 à 20:23
Par contre, pour ma culture personnelle, comment est ce que je fais pour surcharger la fonction compareTo ?
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
4 mars 2009 à 21:02
Salut,

En la redéfinissant dans ta classe, comme je l'ai fait.
______________________________________
DarK Sidious
0

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

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
4 mars 2009 à 21:06
pardon

merci
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 mars 2009 à 07:49
Salut,

Pardon, ca me fait bien rire tout ces profs qui vous imposent des trucs vraiment pas standard : c'est pas comme cà qu'on apprends le langage : j'imagine bien le gars qui ne cherche pas plus loin que son cours, bon il découvrira jamais que pour faire un tri, on n'est pas obligé de réinventer la roue en java...
______________________________________
DarK Sidious
0
Rejoignez-nous