Java: ordenar una colección usando una CollatorKey
-
07-07-2019 - |
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);
...
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
- Cree un SortedMap m, donde T es el tipo de los objetos que desea ordenar usando
CollationKeys
. Puede usarTreeMap
como implementación - 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);