Pregunta

lo que me gustaría lograr es ordenar una colección de objetos por un valor de cadena. Sin embargo, de forma dependiente de la configuración regional utilizando un intercalador Debido a razones de rendimiento, no quiero utilizar el método Collator compare () (como se muestra a continuación en el código) en lugar de la clase CollationKey, ya que la API de Java indica que el uso de CollationKey es mucho más rápido.

¿Pero cómo implemento el método compareTo () usando CollationKey? Hasta donde lo entendí, tengo que escribir completamente todos los Métodos de comparación por mi cuenta si voy a usar una CollationKey. Por lo tanto, ya no podré usar los métodos Collections.sort () ... Estoy muy agradecido por un ejemplo que es fácil de entender y la implementación más eficiente para ordenar los objetos de la Colección de Persona usando una CollationKey.

¡Gracias!

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);
...
¿Fue útil?

Solución

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

}

Otros consejos

  1. Cree un SortedMap m, donde T es el tipo de los objetos que desea ordenar usando CollationKeys . Puede usar TreeMap como implementación
  2. Para cada elemento e que desee ordenar, m.put (collator.getCollationKey (e. {getStringYouWantToSortOn}), e);

Iterar sobre m.values ??() debería producir sus objetos, ordenados por la cadena que desee usando CollationKeys .

Creo que esto no es eficiente, pero debería funcionar.

use un comparador en lugar de hacer que la persona sea comparable. su Comparador puede tomar instancias de 2 personas y compararlas en función de alguna instancia de Collator. luego llame

Collections.sort(list, myPersonComparator);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top