Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:存储对象的高效数据结构,无';逻辑';复制品_Java_Data Structures_Hash_Hashset - Fatal编程技术网

Java:存储对象的高效数据结构,无';逻辑';复制品

Java:存储对象的高效数据结构,无';逻辑';复制品,java,data-structures,hash,hashset,Java,Data Structures,Hash,Hashset,假设我有一个名为City的类,它存储有关城市的一些数据: public class City { String [] states; String name; double lat, lng; //Constructors, getters/setters, etc } 我想保留一份没有副本的城市列表。现在通常情况下这很容易(使用哈希集),但我将比较两个在技术上不同(不同的内存地址)但相同字符串和双精度值的对象。我希望我的哈希集考虑具有相同的内部值的对象是“

假设我有一个名为City的类,它存储有关城市的一些数据:

public class City {

    String [] states;
    String name;
    double lat, lng;

    //Constructors, getters/setters, etc
}
我想保留一份没有副本的城市列表。现在通常情况下这很容易(使用哈希集),但我将比较两个在技术上不同(不同的内存地址)但相同字符串和双精度值的对象。我希望我的哈希集考虑具有相同的内部值的对象是“等价的”。< /P> 我似乎不知道该怎么做。我是否重写hashCode()方法?或者我重写equals()方法

你想做以下工作吗

public int hashCode() {
    return (double) name.hashCode() + lat * 100 + lng;
}

只需使用一个集合并为类重新定义
City
两种方法:

请记住,重新定义equals和hashcode始终是一种很好的做法,如果在数据结构中没有像
HashSet
HashMap
这样的奇怪行为,则不可能只重新定义其中一个

注:是正确的数据结构,因为对于定义:

不包含重复元素的集合。更正式地说,设置 不包含一对元素e1和e2,使得e1.equals(e2)和at 大多数情况下只有一个空元素。正如其名称所暗示的那样,该接口建模 数学集合抽象


只需使用一个集合并为类重新定义
City
两种方法:

请记住,重新定义equals和hashcode始终是一种很好的做法,如果在数据结构中没有像
HashSet
HashMap
这样的奇怪行为,则不可能只重新定义其中一个

注:是正确的数据结构,因为对于定义:

不包含重复元素的集合。更正式地说,设置 不包含一对元素e1和e2,使得e1.equals(e2)和at 大多数情况下只有一个空元素。正如其名称所暗示的那样,该接口建模 数学集合抽象


在比较
equals
中的
字符串
double
值的实际值时,您应该重写
equals
hashCode
,并将哈希值建立在
hashCode
方法中的值的基础上

在您显示的实现中,哈希可能很弱—您可能希望使用一个主种子

当按照建议实施时,
equals
hashCode
将比较对象,并根据其成员的值将它们放入bucket中,这通常是您想要的


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

在比较
equals
字符串
double
值的实际值时,您应该重写
equals
hashCode
,并将哈希值基于
hashCode
方法中的值

在您显示的实现中,哈希可能很弱—您可能希望使用一个主种子

当按照建议实施时,
equals
hashCode
将比较对象,并根据其成员的值将它们放入bucket中,这通常是您想要的


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

如果要使用HashSet,可以重写hashCode和equals,也可以重写这两种方法。将字段设为最终字段(或至少在逻辑上为最终字段)。如果它们是可变的,则在
集合中可能会出现重复项,因为它们在插入时是“唯一的”,但在插入后不是唯一的。如果要使用hashset,可以同时重写hashCode和equals。将字段设为final(或至少在逻辑上是final)。如果它们是可变的,您可能会在
集合中得到重复的,因为它们在插入时是“唯一的”,但随后不是。Joshua Bloch的《有效Java》一书在第8项和第9项中详细讨论了这一主题Joshua Bloch的《有效Java》一书在第8项和第9项中详细讨论了这一主题