gpt4 book ai didi

java - 使用对象哈希码实现可比性

转载 作者:行者123 更新时间:2023-12-01 00:49:53 27 4
gpt4 key购买 nike

我有一个通用的方法,需要对通用对象进行排序和搜索,

旧版本:

    public <T> int isIn(T[] list, T t) {

Arrays.sort(list, Comparator.comparingInt(Object::hashCode));
return Arrays.binarySearch(values,updatedObject.hashCode())

}

新版本:

    public <T> int isIn(T[] list, T t) {

Arrays.sort(list, Comparator.comparingInt(Object::hashCode));
return Arrays.binarySearch(values,updatedObject.hashCode(),Comparator.comparingInt(Object::hashCode))

}

假设 hashcode() 已正确实现,我想不出任何可能会失败或出现任何错误的情况。在什么情况下(如果有的话)这可能会给我们带来错误!

注意:代码已编辑,我将 Comparator 添加到二进制搜索中

最佳答案

您的代码存在很多问题。

  1. hashCode 用于推断对象不等性。这意味着两个对象实际上可能具有相同的 hashCodeequals 调用可能返回 false(另请参见 here)。在这种情况下,binarySearch 的结果可能会产生意想不到的结果(另请参见 here)。
  2. 不传递 Comparator
  3. binarySearch 调用假定您的对象是根据它们的自然顺序排序的,这意味着它们是 Comparable(我们不知道你的代码)。如果您的对象不是Comparable,您将在调用binarySearch 时得到一个ClassCastException。您至少需要在对数组进行排序时使用 Comparator,并将其传递给您的 binarySerach 调用(请参阅 here 了解重载 API)。

注意:OP 添加了 Comparator 并编辑了问题 - 仅对以前版本的问题有效。

  1. 作为通用的 OO 指南,您可能需要重新考虑要将 isIn 方法用于哪些对象,并且可能将泛型类型绑定(bind)到可以在以下方面产生足够信息的广泛类型属性具有自然顺序,或者至少可以使用 Comparator 根据排序有意义的属性进行排序。 TL;DR 哈希码的目的不是对对象进行排序。
  2. 按照第 3 点,您希望 isIn 方法返回 boolean 类型,而不是整数类型。如果您的目标只是推断您的数组是否包含给定值,请覆盖传递的对象中的 equals,将您的数组包装在合适的 Collection 中并调用 contains .

关于java - 使用对象哈希码实现可比性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46935839/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com