2009-09-14 32 views
7

lo que me gustaría lograr es ordenar una colección de objetos por un valor de cadena. Sin embargo, en una forma dependiente de la configuración regional utilizando un clasificador. Debido a razones de rendimiento, no quiero usar 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 java indica que usar CollationKey es mucho más rápido.Java: ordenar una colección utilizando una CollatorKey

Pero, ¿cómo implemento el método compareTo() usando la CollationKey? Por lo que yo entendí, tengo que escribir completamente todos los métodos de comparación por mi cuenta si voy a utilizar una CollationKey. Así que 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 Collection of Person utilizando 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); 
... 

Respuesta

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

} 
+0

Hola Erickson, muchas gracias por la solución inteligente, lo implementaré así, ¡gracias! – jan

0
  1. Crear una SortedMap m, donde T es el tipo de los objetos que desea ordenar el uso de CollationKeys. Puede utilizar TreeMap como la implementación
  2. Para cada elemento de correo que desea ordenar, m.put(collator.getCollationKey(e.{getStringYouWantToSortOn}), e);

interactuando sobre m.values() debe ceder sus objetos, ordenados por la cadena que desea utilizar CollationKeys.

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

+0

de Erickson conduce a una solución más eficiente. – alex

+0

En mi caso, la solución aceptada no pudo implementarse y esta funcionó perfectamente. –

-2

utiliza un Comparador en lugar de hacer que una persona sea comparable. su Comparador puede tomar 2 instancias de Persion y compararlas en base a alguna instancia de Collator. a continuación, llamar respuesta

Collections.sort(list, myPersonComparator); 
+0

El problema es almacenar la clave de clasificación en el Comparador para que no se calcule repetidamente ... – alex

+0

ah, veo el problema. no he usado Collators en absoluto. pensé que la pregunta original era simplemente abordar la readquisición continua de la instancia de Collator. – james

Cuestiones relacionadas