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

时间:2015-04-29 10:53:26

标签: java hashmap hashcode

修改

我已尝试过此HashMap with multiple values under the same key,而我的hashMap现在看起来像HashMap<String, List<Place>> placeMap = new HashMap<>();

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

  

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

  

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

这是我的添加,它创建了错误:

NamedPlace p = new NamedPlace(x,y,answer,col,cat);
                placeMap.put(answer, p);
DescPlace dp = new DescPlace(x,y,answer, desc, col, cat);
                mp.add(dp);
                placeMap.put(answer, dp);

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

OP

我在这里开展一个小项目。问题是我需要在项目的这一部分使用HashMap而不是ArrayList,因为HashMap的搜索速度更快。我已经创建了这样的HashMap:

HashMap<String, Object> placeMap = new HashMap<>(); 

String是Object的名称,但事实是多个对象可以具有相同的名称。所以我在我的搜索域中搜索一个对象,并且我希望将具有该名称的所有对象存储到ArrayList中,这样我就可以更改它们中的信息。

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

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

1 个答案:

答案 0 :(得分:0)

使用标准Map<String, List<YourClassHere>>实例时,请务必记住每个条目的地图值都是List<YourClassHere>,并且不会以任何特殊方式处理它。所以在你的情况下,如果你有

private Map<String, List<Place>> placeMap = new HashMap<>();

然后要存储您需要执行的值,如下所示:

NamedPlace p = new NamedPlace(x,y,answer,col,cat);
List<Place> list = placeMap.get (answer);
list.add(p);

但是,这段代码存在一些潜在的问题。

  • 它没有考虑到answer中可能没有placeMap
  • 它假定您查询的每个密钥始终都是List<Place>个实例。

因此,解决这些潜在问题的最佳方法是执行以下操作(Java 7及更高版本):

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

if (placeMap.containsKey (answer) && placeMap.get (answer) != null) {
    placeMap.get (answer).add(p);
} else {
    List<Place> list = new ArrayList<Place> (); // ..or whatever List implementation you need
    list.add (p);
    placeMap.put (answer, list);
}

如果你想浏览地方列表,代码将如下所示:

if (placeMap.containsKey (key) && placeMap.get (answer) != null) {
    for (Place p: placeMap.get (key)) {
        // Do stuff
    }
}