2014-11-04 49 views
-2

我想知道是否有一种更有效的方式将元素添加到哈希映射内的列表中,而不是制作列表的副本,将元素添加到共享列表中,然后使关联到列表中,以覆盖该地图部分位置的特定键地图里面一放......Java:将元素添加到HashMap中的列表

Map <Integer, List<Object>> myMap = new HashMap <Integer, List<Object>>(); 


....add function 

List <Object> tmp = new LinkedList(); 
if (myMap.containsKey(myListKey.hashCode())) { //keycheck 
    tmp = myMap.get(myListKey.hashCode());  //copy 
    tmp.add(myObjectToAdd);     //add 
    myMap.put(myListKey.hashCode(), tmp);  //overwrite 
} 

我尝试了几种方式可以进入内部列表的直接访问,但编译器似乎对她/它今天...

+6

你为什么使用'hashCode()'作为关键字?这只是*问*的麻烦。什么让你认为你目前的代码是*复制*一个清单?它只是提取参考。 (最后你不需要'put' ...)有时间学习更多关于散列码和引用的知识,IMO。 – 2014-11-04 16:03:19

回答

4

首先,没有理由你应该打电话hashCode()将项目列入清单。首先,不同的密钥可以具有相同的哈希码,这将导致您可能不想要的行为。只需将钥匙本身用作钥匙即可。 A HashMap将在内部使用密钥的哈希码来有效地执行get/put操作。

你的附加功能应该看起来更像是这样的:

Map<ListKeyType, List<Object>> myMap = ... 

... add function 

List<Object> tmp = myMap.get(myListKey); 
if (tmp == null) { 
    tmp = new LinkedList<Object>(); 
    myMap.put(myListKey, tmp); 
} 
tmp.add(myObjectToAdd); 

这样的话,你只能创建一个新的列表时,地图中不包含的关键。

+1

不行,这是检查! – vefthym 2014-11-04 16:08:07

+1

@almasshaikh - 它不会抛出一个空指针异常,因为如果'tmp'为'null',在它被使用之前它会被分配一个非'null'值。 – 2014-11-04 16:08:23

1

您可以使用泰德·霍普的解决方案,这工作完全正常,或使用番石榴的ListMultimap,这样的:

ListMultimap<ListKeyType,Object> myMap = ArrayListMultimap.create(); 

...add function 

myMap.put(myListKey, myObjectToAdd); 

我会选Ted的回答,只是添加这个答案另一种选择。

此外,编译器“在他们的期限”爱番石榴!

相关问题