Frage

Was würde Ich mag zu erreichen, ist eine colletion von Objekten durch einen String-Wert zu sortieren. Jedoch in einem Gebietsschema abhängige Weise eine Zusammentragmaschine verwendet wird. Aus Performancegründen möchte ich nicht die Collator vergleichen Methode verwenden () (wie in der unten stehenden Code) und nicht die CollationKey Klasse, wie die Java-API stellt die eine CollationKey mit viel schneller ist.

Aber wie implementiere ich die compareTo () -Methode das CollationKey mit? Soweit ich es verstanden habe ich völlig den Vergleich alle auf meinem eigenen Methoden schreiben, wenn ich eine CollationKey wird verwenden. Also werde ich auch nicht mehr in der Lage sein, die Collections.sort () Methoden zu verwenden ... Ich bin sehr dankbar für ein Beispiel, das einfach zu verstehen und die effizienteste Implementierung der Sammlung von Person-Objekte zu sortieren, eine CollationKey verwenden.

Danke!

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);
...
War es hilfreich?

Lösung

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

}

Andere Tipps

  1. Erstellen Sie eine SortedMap m, wobei T die Art der Objekte, die Sie mit CollationKeys sortieren möchten. Sie können TreeMap als Implementierung verwenden
  2. Für jedes Element e Sie sortieren möchten, m.put(collator.getCollationKey(e.{getStringYouWantToSortOn}), e);

Iterieren über m.values() sollte durch die Zeichenfolge Ihre Objekte, sortiert ergeben Sie CollationKeys verwenden möchten.

Ich glaube, dies ist nicht effizient, aber es sollte funktionieren.

verwenden, um einen Komparator, anstatt, Person vergleichbar. Ihr Vergleicher kann 2 Person Instanzen nehmen und sie basierend auf einigen Sorter-Instanz vergleichen. dann ruft

Collections.sort(list, myPersonComparator);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top