7
votes

Java: Trier une collection à l'aide d'un collatorkey

Ce que je voudrais réaliser est de trier une collée d'objets par une valeur de chaîne. Cependant, dans une voie dépendante locale à l'aide d'un collateur. En raison des raisons de performance, je ne veux pas utiliser la méthode Comparer () Collateur (comme ci-dessous dans le code) plutôt que la classe CollationKey, car l'API Java déclare que l'utilisation d'un collationkey est beaucoup plus rapide.

Mais comment puis-je implémenter la méthode comparète () en utilisant la collationkey? Depuis que je l'ai compris, je dois complètement écrire toutes les méthodes de comparaison à mienne si je vais utiliser un collationkey. Donc, je ne pourrai même plus utiliser les méthodes Collections.sort () ... Je suis très reconnaissable pour un exemple facile à comprendre et une implémentation la plus efficace pour trier la collection d'objets de personne utilisant un collationkey. < / p>

merci! xxx


0 commentaires

3 Réponses :


0
votes
  1. Créez une trieuseMap m, où T est le type des objets que vous souhaitez trier à l'aide de CollationsKeys . Vous pouvez utiliser Treemap comme implémentation
  2. pour chaque élément E que vous souhaitez trier, m.put (collator.getcollationkey (e. {getstringyouwanttosorton}), e);

    itération sur m.values ​​() devrait produire vos objets, triés par la chaîne que vous souhaitez utiliser CollationsKeys . .

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


2 commentaires

La réponse d'Erickson conduit à une solution plus efficace.


Dans mon cas, la solution acceptée ne pouvait être mise en œuvre et celle-ci fonctionnait parfaitement.



-2
votes

Utilisez un comparateur au lieu de faire une personne comparable. Votre comparateur peut prendre 2 instances d'actions et les comparer en fonction de l'instance de collateur. puis appelez xxx


2 commentaires

Le problème stocke la collationkey dans le comparateur afin que ce ne soit pas calculé à plusieurs reprises ...


Ah, je vois le problème. Je n'ai pas utilisé de collateurs du tout. Je pensais que la question initiale était simplement adressée à réacquérir continuellement l'instance de collateur.



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

}

1 commentaires

Bonjour Erickson, merci beaucoup pour la solution intelligente, je vais en mettre en œuvre comme ça, merci!