Multiple values for a key in HashMap in Java

自古美人都是妖i 提交于 2019-12-18 07:16:09

问题


Is it possible to keep multiple values corresponding to a key in a HashMap? If yes, how?


回答1:


Yes, this is called chaining. You will want to avoid chaining as much as possible, especially if the size of the chain starts increasing. Longer chain size will counter the whole purpose of using a hash structure because the goal is to come as close to O(1) as possible.

Map<String, List<String>> hm = new HashMap<String, List<String>>();
List<String> values = new ArrayList<String>();
values.add("Value 1");
values.add("Value 2");
hm.put("Key1", values);



回答2:


You could give a shot at Guava library (former Google collections). It has implementations of Multimaps which can store multiple values for a single key.

For example ListMultimap implementations allow duplicate key/value pairs which are kept in insertion order.

Here's how you'd use it:

ListMultimap<String, Integer> numberClasses = ArrayListMultimap.create();
numberClasses.put("odd", 1);
numberClasses.put("odd", 3);
numberClasses.put("odd", 5);

numberClasses.put("even", 2);
numberClasses.put("even", 4);
numberClasses.put("even", 6);

assertEquals(Arrays.asList(1,3,5), numberClasses.get("odd"));
assertEquals(Arrays.asList(2,4,6), numberClasses.get("even"));

Another cool example would be SetMultimap, which is very similar to ListMultimap except that values for a key are kept in a set. (From user perspective, I don't know how exactly it is implemented.)

SetMultimap<String, Integer> setMultimap= HashMultimap.create();
setMultimap.put("key1", 1);
setMultimap.put("key1", 1);
setMultimap.put("key1", 1);
setMultimap.put("key1", 2);

setMultimap.put("key2", 1);
setMultimap.put("key2", 3);

assertEquals(ImmutableSet.of(1,2), setMultimap.get("key1"));
assertEquals(ImmutableSet.of(1,3), setMultimap.get("key2"));



回答3:


Use Map<String, List<String>>.




回答4:


Strictly speaking, no.

But! You can have as your value, some kind of Collection and use that to store as many values as you wish.




回答5:


Yes, but only if the value type being stored in your Map is an array or List:

Map<String, List<String>> myMap

or

Map<String, String[]> myMap

But it's generally bad practice to build up generic data structures inside generic data structures.

Why not write a domain-specific class that wraps the HashMap, and makes it easier for you to check for existence of a value, number of items per key, etc?



来源:https://stackoverflow.com/questions/12536683/multiple-values-for-a-key-in-hashmap-in-java

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!