繁体   English   中英

Java:高效的数据结构,可存储没有“逻辑”重复项的对象

[英]Java: Efficient data structure to store object with no 'logical' duplicates

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

只需使用Set并为您的班级City重新定义这两种方法:

请记住,重新定义均等和哈希码始终是一个好习惯,并且在没有像HashSetHashMap这样的数据结构中出现奇怪行为的情况下,仅重新定义它们之一是不可能的。

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

一个不包含重复元素的集合 更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)最多包含一个空元素。 顾名思义,此接口对数学集合抽象进行建模。

在比较String的实际值和equals double值时,您应该覆盖equalshashCode ,并将哈希值基于hashCode方法中的哈希值。

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

按照建议实施时, equalshashCode将比较您的对象,并根据其成员的值将它们放在存储桶中,这通常是您想要的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM