Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:使用CollatorKey对集合进行排序_Java_Comparable - Fatal编程技术网

Java:使用CollatorKey对集合进行排序

Java:使用CollatorKey对集合进行排序,java,comparable,Java,Comparable,我想要实现的是按字符串值对对象集合进行排序。但是,使用collator以依赖于区域设置的方式。由于性能原因,我不想使用Collator compare()方法(如下代码中所示),而是使用CollationKey类,因为java API声明使用CollationKey要快得多 但是如何使用CollationKey实现compareTo()方法呢?据我所知,如果要使用CollationKey,我必须完全自己编写所有比较方法。所以我甚至不能再使用Collections.sort()方法。。。我非常感谢

我想要实现的是按字符串值对对象集合进行排序。但是,使用collator以依赖于区域设置的方式。由于性能原因,我不想使用Collator compare()方法(如下代码中所示),而是使用CollationKey类,因为java API声明使用CollationKey要快得多

但是如何使用CollationKey实现compareTo()方法呢?据我所知,如果要使用CollationKey,我必须完全自己编写所有比较方法。所以我甚至不能再使用Collections.sort()方法。。。我非常感谢您提供了一个易于理解的示例和一个使用排序键对Person对象集合进行排序的最有效的实现

谢谢大家!

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);
集合。排序(列表);
...
  • 创建SortedMap m,其中T是要使用排序键排序的对象类型。您可以使用
    TreeMap
    作为实现
  • 对于要排序的每个e元素,
    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);
      }
    
    }