Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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 如何从具有相同密钥的hashmap存储多个对象?_Java_Hashmap_Hashcode - Fatal编程技术网

Java 如何从具有相同密钥的hashmap存储多个对象?

Java 如何从具有相同密钥的hashmap存储多个对象?,java,hashmap,hashcode,Java,Hashmap,Hashcode,编辑 我已经试过了,我的hashMap现在看起来像这样hashMap placeMap=newhashmap() 还尝试放置Object而不是Place(Place是我的超类)。但当我现在创建子类并希望将它们添加到HashMap时,我得到: 类型HashMap中的方法put(String,List)不适用于参数(String,NamedPlace) 及 类型HashMap中的方法put(String,List)不适用于参数(String,DescPlace) 以下是我的添加,它导致了错误: Na

编辑

我已经试过了,我的hashMap现在看起来像这样
hashMap placeMap=newhashmap()

还尝试放置Object而不是Place(Place是我的超类)。但当我现在创建子类并希望将它们添加到HashMap时,我得到:

类型
HashMap
中的方法put(String,List)不适用于参数(String,NamedPlace)

类型
HashMap
中的方法put(String,List)不适用于参数(String,DescPlace)

以下是我的添加,它导致了错误:

NamedPlace p = new NamedPlace(x,y,answer,col,cat);
                placeMap.put(answer, p);

NamedPlace和DescPlace都是要放置的子类,我希望它们都在同一个HashMap中

OP

我正在做一个小项目。问题是,我需要在项目的这一部分使用HashMap而不是ArrayList,因为HashMap的搜索速度要快得多。我创建了一个如下的哈希映射:

HashMap<String, Object> placeMap = new HashMap<>(); 
if (placeMap.containsKey (key) && placeMap.get (answer) != null) {
    for (Place p: placeMap.get (key)) {
        // Do stuff
    }
}
HashMap placeMap=newhashmap();
字符串是对象的名称,但问题是多个对象可以具有相同的名称。因此,我在搜索字段中搜索一个对象,我想将所有具有该名称的对象存储到ArrayList中,这样我就可以只更改其中的信息

对象有很多不同的值,如名称、位置、一些布尔值等


我是否需要在我的对象类中创建一个HashCode方法,该方法将创建一个唯一的HashCode?

当使用标准的
映射
实例时,请务必记住,每个条目的映射值将是一个
列表
,并且不会以任何特殊方式处理它。所以在你的情况下,如果你有

private Map<String, List<Place>> placeMap = new HashMap<>();
如果要通过位置列表进行scna,代码如下所示:

HashMap<String, Object> placeMap = new HashMap<>(); 
if (placeMap.containsKey (key) && placeMap.get (answer) != null) {
    for (Place p: placeMap.get (key)) {
        // Do stuff
    }
}

使用
映射
,因为映射值现在是一个
列表
,所以必须
设置
从映射中获取该类型的对象。要添加一个
NamedPlace
,检索列表(如果存在)并将
NamedPlace
添加到列表中您非常接近解决方案,只需更改
placeMap.put(答案,p)
placeMap.get(答案)。添加(p)。确保映射的每个条目都不会出现未初始化的列表。Multimap试试看,为什么在不使用Java 8的特性(流API对于手头的任务肯定很有用)的情况下编写“假设您使用的是Java 8”?相反,这是自2004年引入泛型以来的一种简单的java方式。@SME\u Dev因为我使用了
new ArrayList()
。诚然,我本可以使用流API,或者应该使用,但我没有首先在编译器中尝试,而是手动编译了代码,因为我没有完全掌握流API,所以我选择不包含它。为了让OP更简单,我假设他在Java方面没有丰富的经验我获取
列表无法解析或不是字段
错误消息。。“其他”中的列表工作正常。我甚至尝试移动
List=newarraylist()在每个method@Laf
newarraylist()
空菱形操作符是在Java7中引入的@FilipBlom
(答案).list.add(p)
可能只是一个打字错误。要么在
if
语句之前声明
列表
,要么根本不通过编写
placeMap.get(answer).add(p)
@FilipBlom YEah我打错了。我现在刚把它修好。SME_-Dev:没错,它确实是在Java7中引入的。但代码示例在Java 8中仍然有效;)
if (placeMap.containsKey (key) && placeMap.get (answer) != null) {
    for (Place p: placeMap.get (key)) {
        // Do stuff
    }
}