Java 使用哈希代码对对象的ArrayList进行排序
我有一个对象的ArrayList(POJO),它有一个Id和另一个字段。我已经在POJO中为Id字段实现了equals()/hashcode()重写。当我使用Object类的equals()方法比较两个对象时,效果非常好。但是,当我将这些对象添加到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进行重写。如果是
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()。