Pergunta

o que eu gostaria de conseguir é classificar um colletion de objetos por um valor de string. No entanto de uma forma dependente da localidade usando um ordenador. Devido a razões de desempenho Eu não quero usar o Collator compare () método (como abaixo no código) em vez da classe CollationKey, como a API java afirma o usando um CollationKey é muito mais rápido.

Mas como faço para implementar o método compareTo () usando o CollationKey? Tanto quanto eu entendi, eu tenho que escrever completamente todos os métodos de comparação em meu próprio se eu vou estar usando um CollationKey. Então eu mesmo não será capaz de usar o Collections.sort () métodos ... Eu sou muito grata a um exemplo que é fácil de entender e uma implementação mais eficiente para classificar a coleção de objetos Person usando um CollationKey.

Obrigado!

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

Solução

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

}

Outras dicas

  1. Criar um SortedMap m, onde T é o tipo dos objetos que você deseja classificar usando CollationKeys. Você pode usar TreeMap como a implementação
  2. Para cada elemento e que deseja classificar, m.put(collator.getCollationKey(e.{getStringYouWantToSortOn}), e);

iteração sobre m.values() deve render seus objetos, classificado pela cadeia que pretende usar CollationKeys.

Eu acredito que esta não é eficiente, mas deve funcionar.

usar um comparador em vez de fazer Pessoa Comparable. seu Comparador pode levar 2 instâncias Pessoa e compará-los com base em alguma instância Collator. em seguida, chamar

Collections.sort(list, myPersonComparator);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top