Comparateur avecTreeSet Java

Comparateur avecTreeSet Java - Java - Programmation

Marsh Posté le 01-09-2014 à 16:24:51    

Bonjour,
 
J ai cree une classe Test pour laquelle j ai defini un comparatuer :
 

Code :
  1. public class Test implements Comparable<Test > {
  2.  
  3.   private Float         number;
  4.  
  5.   private Integer       weight;
  6.    
  7.   private String        category;
  8.  
  9.   public Test() {
  10.  
  11.   }
  12. public Test(float number, int weight, float ratio, String category) {
  13.  
  14.     this.number= number;
  15.     this.weight = weight;
  16.     this.category = category;
  17.    
  18.   }
  19. public String toString() {
  20.  
  21.     String result = "";
  22.    
  23.     result = result.concat(" -- Number-->> " + number)
  24.                    .concat(" -- Weight -->> " + weight)
  25.                    .concat(" -- Category -->> " + category);
  26.    
  27.     return result;
  28.   }
  29. public int compareTo(test compareTest) {
  30.  
  31.     if(this.number!= compareTest.number) {
  32.       return this.number.compareTo(compareTest.number);
  33.     }
  34.     else if(this.weight!= compareTest.weight) {
  35.       return this.weight.compareTo(compareTest.weight);
  36.     }
  37.     else if(this.category != compareTest.category) {
  38.       return this.category.compareTo(compareTest.category);
  39.     }
  40.     else {
  41.       return 0;
  42.     }
  43.   }
  44.  
  45.   public static Comparator<Test> comparator = new Comparator<Test>() {
  46.                                                            
  47.                                                             public int compare(Test test1,
  48.                                                                                Test test2) {
  49.                                                            
  50.                                                               return test1.compareTo(test2);
  51.                                                             }
  52.                                                            
  53.                                                           };
  54.  
  55. }


 
 
En gros, j aimerais stocker dans un TreeSet differents objets Test tries par ordre ascendant suivant number, weight (si number est le meme pour deux objets) ou category (si number et weight sont les memes pour deux objets).
 
Le probleme c est que etant donne ce code,  
 

Code :
  1. TreeSet<Test> tree= new TreeSet<Test>(Test.comparator);
  2.    
  3.     Test t1 = new Test(2f, 12,"1" );
  4.     Test t2 = new Test(3f, 11, "2" );
  5.     Test t3= new Test(4f, 10, "3" );
  6.     tree.add(t1);
  7.     tree.add(t2);
  8.     tree.add(t3);
  9. for(Test test : tree) {
  10.       System.out.println(test.toString());
  11.     }


 
je m attendrais a tree contenant [t1, t2, t3] alors que je n obtiens dans tree que t1.
Je comprends pas pourquoi bien que les trois objets sont tous differents et donc ne s excluent pas dans le TreeSet.
 
 
Qu en pensez vous ?
 
Merci de votre aide ?


Message édité par ahmadou_20 le 01-09-2014 à 17:33:59
Reply

Marsh Posté le 01-09-2014 à 16:24:51   

Reply

Marsh Posté le 01-09-2014 à 16:48:51    

Je suis p'tetre un peu con mais pourquoi le comparateur de ton TreeSet c'est celui de CancellationOption et pas celui de Test?
Peux-tu filer la definition du comparateur de CancellationOption?
Pourquoi definir un comparateur pour Test si c'est pour ne pas s'en servir?
 
Enfin bref, en copiant/collant ton code tel quel dans Eclipse, changeant le comparateur du TreeSet pour utiliser celui de Test, et corrigeant les appels aux constructeur qui sont invalides (3 parametres passes pour 4 demandes), ca marche nickel.


---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 01-09-2014 à 17:28:40    

Oui desole il n ya pas de Cancellation option.
 
Il y que Test.
 
J ai corrige le code ci dessus.
 
mais le probleme subsiste.
 
desole pour le malentendu !!!!

Reply

Marsh Posté le 01-09-2014 à 18:47:28    

Ben heu "le probleme subsiste", il faut que tu sois plus precis. Comme dit plus haut, ton code marche tel quel sous Eclipse:

public class Test implements Comparable<Test > {
 
  private Float         number;
 
  private Integer       weight;
   
  private String        category;
 
   
public Test(float number, int weight, String category) {
 
    this.number= number;
    this.weight = weight;
    this.category = category;
   
  }
public int compareTo(Test compareTest) {
 
    if(this.number!= compareTest.number) {
      return this.number.compareTo(compareTest.number);
    }
    else if(this.weight!= compareTest.weight) {
      return this.weight.compareTo(compareTest.weight);
    }
    else if(this.category != compareTest.category) {
      return this.category.compareTo(compareTest.category);
    }
    else {
      return 0;
    }
  }
 
  public static Comparator<Test> comparator = new Comparator<Test>() {
                                                           
                                                            public int compare(Test test1,
                                                              Test test2) {
                                                           
                                                              return test1.compareTo(test2);
                                                            }
                                                           
                                                          };
                                                         
                                                         
  public static void main(String[] args) {
     TreeSet<Test> tree= new TreeSet<Test>(Test.comparator);
       
     Test t1 = new Test(2f, 12,"1" );
     Test t2 = new Test(3f, 11, "2" );
     Test t3= new Test(4f, 10, "3" );
        tree.add(t1);
        tree.add(t2);
        tree.add(t3);
       
        System.out.println(tree.size());
  }
 
}


Le System.out.println m'affiche bien 3, et si je debugge dessus, je vois bien le TreeSet en memoire avec 3 elements tries (3f sur la racine, 2f a gauche de la racine, 4f a droite de la racine).

 

Edit: et si tu affiches le contenu de l'arbre:

public static void main(String[] args) {
     TreeSet<Test> tree= new TreeSet<Test>(Test.comparator);
       
     Test t1 = new Test(2f, 12,"1" );
     Test t2 = new Test(3f, 11, "2" );
     Test t3= new Test(4f, 10, "3" );
        tree.add(t1);
        tree.add(t2);
        tree.add(t3);
       
        for (Iterator<Test> it = tree.iterator(); it.hasNext();) {
         Test t = it.next();
         System.out.println(t.number);
        }
  }


2.0
3.0
4.0


Message édité par lasnoufle le 01-09-2014 à 18:52:16

---------------
C'était vraiment très intéressant.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed