Domanda

quello che vorrei ottenere è ordinare una collezione di oggetti in base a un valore di stringa. Tuttavia, a seconda delle impostazioni locali, utilizzando un raccoglitore. Per motivi di prestazioni non voglio usare il metodo Collator compare () (come sotto nel codice) piuttosto la classe CollationKey, poiché l'API java afferma che l'utilizzo di CollationKey è molto più veloce.

Ma come posso implementare il metodo compareTo () usando CollationKey? Per quanto ho capito, devo scrivere completamente tutti i metodi di confronto da solo se userò un CollationKey. Quindi non sarò più in grado di usare i metodi Collections.sort () ... Sono molto grato per un esempio che è facile da capire e un'implementazione più efficiente per ordinare gli oggetti Collection of Person usando un CollationKey.

Grazie!

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);
...
È stato utile?

Soluzione

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

}

Altri suggerimenti

  1. Crea una SortedMap m, dove T è il tipo di oggetti che vuoi ordinare usando CollationKeys . Puoi usare TreeMap come implementazione
  2. Per ogni elemento e che desideri ordinare, m.put (collator.getCollationKey (e. {getStringYouWantToSortOn}), e);

Iterando su m.values ??() dovrebbe produrre i tuoi oggetti, ordinati in base alla stringa desiderata usando CollationKeys .

Credo che questo non sia efficiente, ma dovrebbe funzionare.

usa un comparatore invece di rendere comparabile la persona. il tuo comparatore può prendere istanze di 2 persone e confrontarle sulla base di alcune istanze di Collator. quindi chiama

Collections.sort(list, myPersonComparator);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top