Is it possible to keep multiple values corresponding to a key in a HashMap? If yes, how?
-
1for example, by storing container type, such as `List`, as value. – Victor Sorokin Sep 21 '12 at 19:07
-
possible duplicate of [HashMap: One Key, multiple Values](http://stackoverflow.com/questions/8229473/hashmap-one-key-multiple-values) – Adam Sep 21 '12 at 19:09
6 Answers
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);
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"));

- 2,595
- 4
- 23
- 31

- 4,285
- 1
- 30
- 33
Use Map<String, List<String>>
.

- 115,165
- 71
- 313
- 417
-
or any other container, better suited for your task. For example, `Set`. Or just plain old array. – Victor Sorokin Sep 21 '12 at 19:09
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.

- 3,324
- 25
- 44
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?

- 31,257
- 32
- 136
- 234
Without using any other Libary Create a map with Key as String and value as HashSet value will be not repeated string.
multivaleMap.computeIfAbsent("key", k -> new HashSet<String>()).add("value1");
multivaleMap.computeIfAbsent("key", k -> new HashSet<String>()).add("value2");
System.out.println(multivaleMap);``` will print {key=[value2, value1]}

- 1
- 2