Java:用于存储没有'逻辑'的对象的高效数据结构。重复

时间:2016-03-14 13:49:00

标签: java data-structures hash hashset

我们假设我有一个名为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;
}

2 个答案:

答案 0 :(得分:3)

只需使用Set并重新定义您的类City两种方法:

请记住,重新定义equals和hashcode始终是一个好习惯,而且在HashSetHashMap等数据结构中没有奇怪行为的情况下,不可能只重新定义其中一个。

注意:Set是正确的数据结构,因为定义:

  

不包含重复元素的集合。更正式的,集合   不包含元素e1和e2对,使得e1.equals(e2)和at   大多数一个null元素。正如其名称所暗示的,这个界面模型   数学集抽象。

答案 1 :(得分:1)

您应该覆盖equalshashCode,同时比较Stringdoubleequals值的实际值,并将哈希值基于这些值在您的hashCode方法中。

在您显示的实现中,哈希可能很弱 - 您可能想要使用素数种子。

按照建议实施时,equalshashCode会比较您的对象,并根据其成员的值将其置于存储桶中,这是您通常需要的。

如果您使用的是IDE(推荐使用),您可以让IDE为您起草这些方法。