我们假设我有一个名为City的课程,它会存储一些城市的数据:
public class City {
String [] states;
String name;
double lat, lng;
//Constructors, getters/setters, etc
}
我想保留一份没有重复的城市列表。现在通常很容易(使用HashSet),但我将比较两个技术上不同的对象(不同的内存地址),但是相同的String和double值。我希望我的HashSet能够将具有相同内部值的对象视为等同的'。
我似乎无法弄清楚如何做到这一点。我是否覆盖hashCode()方法?或者我可能会覆盖equals()方法?
以下是否会有以下工作?
public int hashCode() {
return (double) name.hashCode() + lat * 100 + lng;
}
答案 0 :(得分:3)
只需使用Set并重新定义您的类City
两种方法:
请记住,重新定义equals和hashcode始终是一个好习惯,而且在HashSet
和HashMap
等数据结构中没有奇怪行为的情况下,不可能只重新定义其中一个。
注意:Set
是正确的数据结构,因为定义:
不包含重复元素的集合。更正式的,集合 不包含元素e1和e2对,使得e1.equals(e2)和at 大多数一个null元素。正如其名称所暗示的,这个界面模型 数学集抽象。
答案 1 :(得分:1)
您应该覆盖equals
和hashCode
,同时比较String
中double
和equals
值的实际值,并将哈希值基于这些值在您的hashCode
方法中。
在您显示的实现中,哈希可能很弱 - 您可能想要使用素数种子。
按照建议实施时,equals
和hashCode
会比较您的对象,并根据其成员的值将其置于存储桶中,这是您通常需要的。
如果您使用的是IDE(推荐使用),您可以让IDE为您起草这些方法。