2009-10-12 5 views
0

J'ai une liste chaînée non triée. Pour le trier, j'ai pensé mettre les valeurs dans un TreeSet avec un comparateur fourni, puis retourner ces valeurs comme une nouvelle liste chaînée. Pourtant, cela échoue.Java: Problème avec TreeSet et LinkedList

Comparator:

public class SortSpeciesByCommonName implements Comparator<Species> { 

    /** 
    * a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second. 
    */ 
    @Override 
    public int compare(Species arg0, Species arg1) { 
     return arg0.getName().compareTo(arg1.getName()); //arg.getName() is String 
    } 

} 

Fonction de tri:

public static LinkedList<Species> sortedAnimals(LinkedList<Species> animals) { 
    TreeSet<Species> sortedBreeds = new TreeSet<Species>(new SortSpeciesByCommonName()); 
    sortedBreeds.addAll(animals); 
    return new LinkedList<Species>(sortedBreeds); 
} 

Lors du test des valeurs, tout semble être toujours en ordre d'insertion.

+0

Veuillez ajouter la classe d'espèces et quelques cas de test. J'ai réduit la classe d'espèces à juste des cordes et tout fonctionne bien. – sanscore

Répondre

7

Pourquoi utilisez-vous pas Collections.sort(List,Comparator):

LinkedList<Species> sorted = new LinkedList<Species>(arg); 
Collections.sort(sorted, new Comparator<Species>() { 
    @Override 
    public int compare(Species s1, Species s2) { 
     return s1.getName().compareTo(s2.getName()); 
    } 
}); 

Nous ne pouvons pas vraiment déboguer votre programme et pourquoi la liste ne sont pas triées. Pouvez-vous fournir un test élémentaire? Quelle est la signature de Species.getName()? Est-ce un String?

+0

Vous devez lier à la surcharge qui prend un 'comparateur '. :-D –

1

Cela ne répond pas directement à votre question, mais il vous sera peut-être plus facile d'utiliser simplement Collections.sort, en passant votre liste et votre comparateur. Enregistre en utilisant un TreeSet.

+1

De plus, TreeSet pourrait avoir l'effet secondaire par inadvertance d'éliminer des éléments avec des noms en double. –