2009-09-14 7 views
7

Ce que je souhaite réaliser consiste à trier une collection d'objets par une valeur de chaîne. Cependant d'une manière dépendante des paramètres régionaux en utilisant un collator. Pour des raisons de performances, je ne souhaite pas utiliser la méthode Collator compare() (comme ci-dessous dans le code) plutôt que la classe CollationKey, car l'API Java indique que l'utilisation d'une clé CollationKey est beaucoup plus rapide. Mais comment implémenter la méthode compareTo() à l'aide de CollationKey? Pour autant que je l'ai compris, je dois écrire complètement toutes les méthodes de comparaison si je vais utiliser une CollationKey. Je ne pourrai même plus utiliser les méthodes Collections.sort() ... Je suis très reconnaissant pour un exemple facile à comprendre et l'implémentation la plus efficace pour trier les objets Collection of Person à l'aide d'une CollationKey.Java: Trier une collection à l'aide d'un CollatorKey

Merci!

public class Person implements Comparable<Person> { 

String lastname; 

public int compareTo(Person person) { 
    //This works but it is not the best implementation for a good performance 
    Collator instance = Collator.getInstance(Locale.ITALY); 
    return instance.compare(lastname, person.lastname); 
} 
} 

... 
ArrayList list = new ArrayList(); 
Person person1 = new Person("foo"); 
list.add(person1); 
Person person2 = new Person("bar"); 
list.add(person2); 
Collections.sort(list); 
... 

Répondre

13
class Person implements Comparable<Person> { 

    private static final Collator collator = Collator.getInstance(Locale.ITALY); 

    private final String lastname; 

    private final CollationKey key; 

    Person(String lastname) { 
    this.lastname = lastname; 
    this.key = collator.getCollationKey(lastname); 
    } 

    public int compareTo(Person person) { 
    return key.compareTo(person.key); 
    } 

} 
+0

Bonjour Erickson, merci beaucoup pour la solution intelligente, je vais l'implémenter comme ça, merci! – jan

0
  1. Créer une SortedMap m, où T est le type des objets que vous souhaitez trier en utilisant CollationKeys. Vous pouvez utiliser TreeMap comme la mise en œuvre
  2. Pour chaque élément e que vous voulez trier, m.put(collator.getCollationKey(e.{getStringYouWantToSortOn}), e);

Enumérer les m.values() devrait donner vos objets, triées par la chaîne souhaitée à l'aide CollationKeys. Je crois que ce n'est pas efficace, mais cela devrait fonctionner.

+0

erickson conduit à une solution plus efficace. – alex

+0

Dans mon cas, la solution acceptée n'a pas pu être implémentée et celle-ci a parfaitement fonctionné. –

-2

utiliser un comparateur au lieu de rendre la personne comparable. Votre comparateur peut prendre 2 instances de Persion et les comparer en fonction d'une instance de Collator. puis appeler la réponse de

Collections.sort(list, myPersonComparator); 
+0

Le problème est de stocker le collationKey dans le comparateur de sorte qu'il n'est pas calculé à plusieurs reprises ... – alex

+0

ah, je vois le problème. Je n'ai pas du tout utilisé Collators. Je pensais que la question initiale était simplement adresser continuellement réacquérir l'instance de Collator. – james

Questions connexes