2014-04-29 6 views
6

Avec ce code je reçois cette sortie:java: TreeSet ordre

TreeSet<String> t=new TreeSet<String>(); 
    t.add("test 15"); 
    t.add("dfd 2"); 
    t.add("ersfd 20"); 
    t.add("asdt 10"); 


Iterator<String> it=t.iterator(); 

while(it.hasNext()){ 
    System.out.println(it.next); 
} 

Je reçois:

asdt 10 
    dfd 2 
    ersfd 20 
    test 15 

Comment puis-je obtenir un ordre de ce genre, sur la base des chiffres, avec TreeSet?

dfd 2 
    asdt 10 
    test 15 
    ersfd 20 
+4

utiliser un comparateur. – njzk2

+2

Au lieu d'avoir des valeurs comme "dfd 2" dans une chaîne. Il serait préférable que vous l'ayez dans 2 champs séparés dans un objet Java (par exemple YourObject). TreeSet t = nouveau TreeSet (); – Jay

Répondre

5

L'implémentation TreeSet est triée par ordre lexicographique des valeurs de chaîne que vous insérez. Si vous voulez trier par la valeur entière, alors vous devrez faire comme ces autres suggestions et créer un nouvel objet et surcharger la méthode compareTo, ou utiliser votre propre comparateur.

Set<String> set = new TreeSet<String>(new Comparator<String>() { 
    public boolean equals(Object obj) { 
     // implement 
    } 
    public int compareTo(String one, String other) { 
     // implement 
    } 
}); 

ou

public class MyClass implements Comparable { 
    private String key; 
    private int value; 

    public int compareTo(MyClass other) { 
     // implement 
    } 

    public boolean equals(MyClass other) { 
     // implement 
    } 

    // snip ... 
} 

Set<MyClass> set = new TreeSet<MyClass>(); 
+0

+1 avez-vous lu docu? ; D –

+1

Juste pour vérifier la signature des méthodes. :-) – jgitter

+0

à propos de 'equals', ne devrait-il pas remplacer Object est égal à? – user7294900

0

Utilisez le constructeur TreeSet qui reçoit un comparateur personnalisé et implémentez un comparateur qui trie différemment la chaîne.

Voici un exemple (non testé, vérifier le code avant d'utiliser):

TreeSet<String> t = new TreeSet<String>(new Comparator<String>() { 
    public int compare(String s1, String s2) { 
     int spaceIndex1 = s1.indexOf(' '); 
     int spaceIndex2 = s2.indexOf(' '); 

     return Integer.parseInt(s1.substring(spaceIndex1 + 1)).compareTo(Integer.parseInt(s2.spaceIndex2 + 1)); 
    } 
}); 
+1

Cela fait encore une comparaison 'String' donc" 20 "viendra avant" 4 ". Il doit extraire le nombre et faire une comparaison numérique. –

+1

Vous avez bien sûr raison, j'ai ajouté le correctif. – eitanfar

+0

Oui, ça va marcher. Bien que je le classe comme code "fragile" en ce que si le format des chaînes change même légèrement, cela pourrait provoquer le lancement de NumberFormatExceptions. Cela peut être correct dans ce cas, mais cela dépend de la contrainte des données d'entrée. –

0

Essayez ceci:

TreeSet set = new TreeSet(new Comparator<String>(){ 
    public int compare(String o1, String o2){ 
     String n1 = o1.split(" ")[1]; 
     String n2 = o2.split(" ")[1]; 
     return Integer.parse(n2) - Integer.parse(n1); 
    } 
    public boolean equals(String o1, String o2){ 
     return compare(o1,o2)==0; 
    } 
}); 
+1

Ce n'est pas valide Java. De plus, j'ajouterais une vérification d'erreur. – jgitter

+1

Ce code ne compile/ne fonctionne pas. Il n'y a pas de méthode 'parse()' pour la classe 'Integer', et l'opérateur'> 'retourne' boolean', pas 'int'. – eitanfar

+0

Je voudrais lancer une exception comme ArrayIndexOutOfBoundsException ... hey le code déjà le jeter. ;RÉ –

-1
class Book implements Comparable<Book> {  
    String name; 
    int id; 

    public Book(String name,int id) { 
     this.name = name; 
     this.id = id; 
    } 

    public int compareTo(Book b) { 
     if(id>b.id){ 
      return 1; 
     }else if(id<b.id){ 
      return -1; 
     }else{ 
      return 0; 
     } 
    } 
} 

public class TreeSet2 { 
    public static void main(String[] args) { 
     Set<Book> set=new TreeSet<Book>(); 

     //Creating Books 
     Book b1=new Book("test", 15); 
     Book b2=new Book("dfd", 2); 
     Book b3=new Book("ersfd", 20); 
     Book b4=new Book("asdt", 10); 

     //Adding Books to TreeSet 
     set.add(b1); 
     set.add(b2); 
     set.add(b3); 
     set.add(b4); 

     //Traversing TreeSet 
     for(Book b:set){ 
      System.out.println(b.name+" "+b.id); 
     } 
    } 
}