Question

ce que je voudrais réaliser est de trier une collection d'objets par une valeur de chaîne. Cependant, de manière dépendante des paramètres régionaux en utilisant un collateur. Pour des raisons de performances, je ne souhaite pas utiliser la méthode Collator compare () (comme ci-dessous dans le code), mais la classe CollationKey, car l'API java indique que l'utilisation d'une CollationKey est beaucoup plus rapide.

Mais comment implémenter la méthode compareTo () à l'aide de CollationKey? Si j'ai bien compris, je dois écrire entièrement toutes les méthodes de comparaison si j'utilise une clé de collation. Donc, je ne pourrai même plus utiliser les méthodes Collections.sort () ... Je suis très reconnaissant pour un exemple facile à comprendre et pour la mise en œuvre la plus efficace pour trier les objets Collection of Person à l'aide d'une CollationKey.

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);
...
Était-ce utile?

La solution

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);
  }

}

Autres conseils

  1. Créez une SortedMap m, où T représente le type des objets à trier à l'aide de CollationKeys . Vous pouvez utiliser TreeMap comme implémentation
  2. Pour chaque élément e que vous souhaitez trier, m.put (collator.getCollationKey (e. {getStringYouWantToSortOn}), e);

Si vous parcourez m.values ??() , vos objets doivent être triés selon la chaîne souhaitée à l'aide de CollationKeys .

Je pense que ce n'est pas efficace, mais cela devrait fonctionner.

utilisez un comparateur au lieu de rendre personne comparable. votre comparateur peut prendre deux instances de personne et les comparer en fonction d'une instance de collateur. puis appelez

Collections.sort(list, myPersonComparator);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top