在HashMap中覆盖之前检索先前的键映射值

时间:2012-04-17 16:02:17

标签: java hashmap

我根据我的代码创建了HashMap ...

HashMap map=new HashMap();//HashMap key random order.
map.put("Amit","Java");
map.put("Saral","J2EE");
map.put("Saral","Andriod");//same key but different value 
map.put("Nitin","PHP");
map.put("hj","Spring1");
System.out.println("There are "+map.size()+" elements in the map.");
System.out.println("Content of Map are...");
Set s=map.entrySet();

Iterator itr=s.iterator();
while(itr.hasNext()){
    Map.Entry m=(Map.Entry)itr.next();
    System.out.println(m.getKey()+"\t"+m.getValue()+"\t"+ m.hashCode());
    }

执行此代码时,key=Saral的值为Android。有没有办法可以获得此密钥的前一个值,即J2EE

5 个答案:

答案 0 :(得分:5)

不,你不能使用标准HashMap。最简单的解决方案是在地图中存储List作为值,然后您可以向列表中添加多个项目(顺便说一下,您也应该使用泛型集合)。为简化起见,您可以使用这样的辅助方法:

void addToMap(Map<String, List<String>> map, String key, String value) {
  List<String> list = map.get(key);

  if (list == null) {
    list = new ArrayList<String>();
    map.put(key, list);
  }
  list.add(value);
}

Map<String, List<String>> map = new HashMap<String, List<String>>();
addToMap(map, "Amit", "Java");
addToMap(map, "Saral", "J2EE");
addToMap(map, "Saral", "Andriod");//same key but different value 
addToMap(map, "Nitin", "PHP");
addToMap(map, "hj", "Spring1");
...

这里的辅助方法只是一个例子 - 完整,强大的实现可能需要包括例如检查重复值,具体取决于您是否允许它们。如果没有,您可能更愿意使用Set代替List

更新

要打印出这个地图的内容,你需要使用一个嵌入式循环遍历每个地图条目的值列表(顺便说一句,你可以使用foreach循环而不是迭代器):

for (Map.Entry<String, List<String>> m : map.entrySet())
{
  for (String v : m.getValue())
  {
    System.out.println(m.getKey()+"\t"+v+"\t"+ m.hashCode());
  }
}

答案 1 :(得分:1)

Map每个密钥最多只能包含一个条目,因此当您致电map.put("Saral","Andriod")时,旧的"J2EE"值将被删除。要支持每个键的多个值,您需要维护Map<String, List<String>>或多地图实现,例如Guava的Multimap

作为旁注,我建议您在编译时开始使用泛型,例如Map<String, String>Iterator<String>等,以确保类型安全。

答案 2 :(得分:0)

旧值被覆盖(替换)。一个唯一键只有一个映射(条目)。因此它不再存在,所以你无法检索它。

答案 3 :(得分:0)

您无法使用Java提供的Map标准实现来执行此操作。然而,有MultiMap的实现(基本上就是你所追求的)。

一个例子来自Google: http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/Multimap.html

请注意,您将无法获得这一个界面,您需要一些类。

答案 4 :(得分:0)

正如其他人所说,这不适用于标准地图。但是,Google的Guava提供了MultiMap界面,您可以使用该界面通过一个密钥存储多个值。

使用示例:

Multimap<String,String> multiMap = ArrayListMultimap.create();
multiMap.put("color", "red");
multiMap.put("color", "blue");
System.out.println(multiMap.get("color")); //returns a ["red', "blue"] list