我根据我的代码创建了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
?
答案 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)