Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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 使用哈希代码对对象的ArrayList进行排序_Java_Sorting_Collections_Arraylist_Hashcode - Fatal编程技术网

Java 使用哈希代码对对象的ArrayList进行排序

Java 使用哈希代码对对象的ArrayList进行排序,java,sorting,collections,arraylist,hashcode,Java,Sorting,Collections,Arraylist,Hashcode,我有一个对象的ArrayList(POJO),它有一个Id和另一个字段。我已经在POJO中为Id字段实现了equals()/hashcode()重写。当我使用Object类的equals()方法比较两个对象时,效果非常好。但是,当我将这些对象添加到arraylist并实现 Collections.sort(arrListOfObjects); 这给了我一个classCastexception。我查了一下,发现我需要实现一个比较器。这个比较器还可以对equals/hashcode进行重写。如果是

我有一个对象的ArrayList(POJO),它有一个Id和另一个字段。我已经在POJO中为Id字段实现了equals()/hashcode()重写。当我使用Object类的equals()方法比较两个对象时,效果非常好。但是,当我将这些对象添加到arraylist并实现

Collections.sort(arrListOfObjects);

这给了我一个classCastexception。我查了一下,发现我需要实现一个比较器。这个比较器还可以对equals/hashcode进行重写。如果是这样的话,那么为什么上面的代码不起作用?(我知道没有比较器,但我的问题是,不可能实现基于对象的hashcode的排序吗?

比较器不处理equals或hashcode,它使用equals或hashcode来确定返回的内容。它是该方法文档的一部分。看
接口并在类中实现它。您可以以SO问题为例。

如消息所述,您的对象需要实现可排序的可比较接口。或者,您可以为
sort()
方法提供一个比较器。例如,假设您的对象是字符串,并且希望根据哈希代码进行排序,则可以执行以下操作:

public static void main(String[] args) {
    List<String> list = Arrays.asList("string", "sdkj");
    for (String s : list) {
        System.out.println(s + "=" + s.hashCode());
    }
    Collections.sort(list, new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            return o1.hashCode() - o2.hashCode();
        }
    });
    System.out.println("After Sorting");
    for (String s : list) {
        System.out.println(s + "=" + s.hashCode());
    }
}
publicstaticvoidmain(字符串[]args){
List=Arrays.asList(“string”,“sdkj”);
用于(字符串s:列表){
System.out.println(s+“=”+s.hashCode());
}
Collections.sort(list,newcomparator(){
@凌驾
公共整数比较(字符串o1、字符串o2){
返回o1.hashCode()-o2.hashCode();
}
});
System.out.println(“排序后”);
用于(字符串s:列表){
System.out.println(s+“=”+s.hashCode());
}
}

实现基于哈希代码的排序当然是可能的,但可能无法始终如一地产生所需的行为。例如,考虑一个类<代码> fo >它的<代码> HASCODE()方法被定义为总是返回一个常量值。例如:

public int hashCode() {
     return 1;
}
考虑到这个hashCode方法和使用这个方法定义的比较器,列表几乎肯定不会正确排序,除非是简单的情况(空列表、单元素列表等)


一般来说,要记住的一件好事是java文档中记录的hashCode equals契约。简而言之,哈希代码冲突可能会导致不相等的对象,从而导致在这些方法上定义的排序无效。

在Java8或更高版本的情况下,我将使用lambda表达式实现比较器

public static void main(String[] args) {
    List<String> list = Arrays.asList("string", "sdkj");
    list.forEach(s -> System.out.println(s + "=" + s.hashCode()));

    Collections.sort(list, (o1, o2) -> (o1.hashCode() - o2.hashCode()));

    System.out.println("After Sorting");

    list.forEach(s -> System.out.println(s + "=" + s.hashCode()));
}
publicstaticvoidmain(字符串[]args){
List=Arrays.asList(“string”,“sdkj”);
list.forEach(s->System.out.println(s+“=”+s.hashCode());
Collections.sort(list,(o1,o2)->(o1.hashCode()-o2.hashCode());
System.out.println(“排序后”);
list.forEach(s->System.out.println(s+“=”+s.hashCode());
}

如果java 8是一个选项,您可以这样定义它:

list.stream().sorted(Comparator.comparing(Pojo::hashCode));

这种方法不需要Pojo实现可比较的接口。

您肯定希望实现可比较的接口。
compareTo()
方法实际上是确定某事物是“大于”还是“小于”另一事物的方法。
equals()。