Java:使用CollatorKey对集合进行排序
我想要实现的是按字符串值对对象集合进行排序。但是,使用collator以依赖于区域设置的方式。由于性能原因,我不想使用Collator compare()方法(如下代码中所示),而是使用CollationKey类,因为java API声明使用CollationKey要快得多 但是如何使用CollationKey实现compareTo()方法呢?据我所知,如果要使用CollationKey,我必须完全自己编写所有比较方法。所以我甚至不能再使用Collections.sort()方法。。。我非常感谢您提供了一个易于理解的示例和一个使用排序键对Person对象集合进行排序的最有效的实现 谢谢大家!Java:使用CollatorKey对集合进行排序,java,comparable,Java,Comparable,我想要实现的是按字符串值对对象集合进行排序。但是,使用collator以依赖于区域设置的方式。由于性能原因,我不想使用Collator compare()方法(如下代码中所示),而是使用CollationKey类,因为java API声明使用CollationKey要快得多 但是如何使用CollationKey实现compareTo()方法呢?据我所知,如果要使用CollationKey,我必须完全自己编写所有比较方法。所以我甚至不能再使用Collections.sort()方法。。。我非常感谢
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);
...
公共类人员实现可比较{
字符串lastname;
公共国际比较(个人){
//这是可行的,但它不是获得良好性能的最佳实现
Collator instance=Collator.getInstance(Locale.意大利语);
返回instance.compare(lastname,person.lastname);
}
}
...
ArrayList=新建ArrayList();
人员1=新人员(“foo”);
列表。添加(人员1);
人员2=新人员(“律师”);
列表。添加(人员2);
集合。排序(列表);
...
TreeMap
作为实现m.put(collator.getCollationKey(e.{getStringYouWantToSortOn}),e代码>
m.values()
应该会生成对象,使用CollationKeys
按所需字符串排序
我相信这是没有效率的,但它应该是有效的。使用比较器,而不是使人具有可比性。您的比较器可以获取2个person实例,并基于某个Collator实例对它们进行比较。然后打电话
Collections.sort(list, myPersonComparator);
class-Person实现可比性{
私有静态最终Collator Collator=Collator.getInstance(Locale.ITALY);
私有最终字符串lastname;
私有最终排序键;
Person(字符串lastname){
this.lastname=lastname;
this.key=collator.getCollationKey(lastname);
}
公共国际比较(个人){
返回key.compareTo(person.key);
}
}
erickson的答案引出了一个更有效的解决方案。在我的例子中,被接受的解决方案无法实现,而这个解决方案工作得很好。问题是将排序键存储在比较器中,这样就不会重复计算了……啊,我看到了问题所在。我根本没用过项圈。我原以为原来的问题只是不断重新获取Collator实例。你好,Erickson,非常感谢您提供的智能解决方案,我将这样实现它,谢谢!
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);
}
}