Multiple Values for a Single Key in HashMap
A HashMap is a data structure in Java that allows you to store key-value pairs. In a standard HashMap, each key is associated with a single value. However, there are circumstances where you might find it necessary to associate several values with a single key. In this guide, we will explore various methods and provide code examples for implementing a HashMap with multiple values for the same key in Java.
1. Why HashMap with Multiple Values?
Imagine building an application to manage some great authors and their works, and want to keep track of the books written by each author. Each author can have multiple books to their name, and we need a data structure to efficiently store this information.
A typical HashMap wouldn’t be adequate in this scenario because it associates only one value with each key. Below is an example code of multiple values per key in a HashMap Java problem:
public class MultipleValueHashMap { public static void main(String[] args) { HashMap authors = new HashMap(); authors.put("charles", "A Tale of Two Cities"); authors.put("chinua", "Things Fall Apart"); //overwrites the value "A Tale of Two Cities" in the "charles" key authors.put("charles", "Great Expectations"); //prints out "Great Expectations" System.out.println(authors.get("charles")); //prints out map System.out.println("" + authors); } }
In the above code, the key charles
is used twice making the second value overwrite the first.
To solve this problem, we can embed a Collection class such as an ArrayList
or a Set
within a HashMap or we can use Third-party libraries like Apache Commons Collections or Google Guava’s Collections.
2. Solution 1: Using Java Collections Framework
To create a HashMap with multiple values, we can use the Java Collections Framework. We can use a HashMap
to store lists of values associated with each key as follows:
public class MultiValueHashMapExample { public static void main(String[] args) { Map<String, ArrayList<String>> multiValueMap = new HashMap<String, ArrayList<String>>(); // Add values to the map multiValueMap.computeIfAbsent("Thomas", k -> new ArrayList<>()).add("The Age of Reason"); multiValueMap.computeIfAbsent("Thomas", k -> new ArrayList<>()).add("Common Sense"); // Adding values for another key multiValueMap.computeIfAbsent("Charles", k -> new ArrayList<>()).add("A Tale of Two Cities"); multiValueMap.computeIfAbsent("Charles", k -> new ArrayList<>()).add("Great Expectations"); // Retrieving values associated with a key List<String> thomasBooks = multiValueMap.get("Thomas"); List<String> charlesBooks = multiValueMap.get("Charles"); System.out.println("Thomas Books: " + thomasBooks); System.out.println("Charles Books: " + charlesBooks); } }
In the above example, we use a HashMap
with a key of type String
and a value of type ArrayList<String>
. Next, we use the computeIfAbsent
method provided by the java.util.Map
interface to compute new values for our keys if the keys are not already present in the map.
If the keys are already on the map, the computeIfAbsent
method returns the existing value associated with the keys. When we access the key Thomas
, and Charles
, all of their associated values will be returned.
The output from running the above code is shown in Fig 1 below:
3. Solution 2: Using Third-party Libraries
To implement a HashMap with multiple values, we can also use third-party libraries that offer specialized data structures for this purpose. Examples of such library is the Guava Collections, which provides a ListMultimap
interface or the Apache Commons Collections MultiMap
.
3.1 Using Guava’s Collection
In Guava, we can add multiple values to a single key using the Multimap
interface that is part of the Guava library’s collection framework. The most commonly used implementation is the ArrayListMultimap
. To use the Guava collections in a Maven project, add the following entry to the POM
:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>30.1.1-jre</version> <!-- Use the latest version --> </dependency>
Now, with the POM updated, we can create a Multimap
and add values to a single key like this:
public class MultiValuesMapExampleGuava { public static void main(String[] args) { // Create a Multimap using ArrayListMultimap Multimap<String, String> multimap = ArrayListMultimap.create(); // Add values to a single key multimap.put("Charles", "Great Expectations"); multimap.put("Charles", "Tale of Two Cities"); // Add more values to a different key multimap.put("Thomas", "Age of Reason"); multimap.put("Thomas", "Common Sense"); // Retrieve values for a key System.out.println("Books by Charles: " + multimap.get("Charles")); System.out.println("Books by Thomas: " + multimap.get("Thomas")); } }
In the above example, we create a Multimap
using ArrayListMultimap
, and then we add multiple values to the keys Charles
and Thomas
. The get
method allows us to retrieve all values associated with a specific key.
When we run the above code, we should get the following output:
Books by Charles: [Great Expectations, Tale of Two Cities] Books by Thomas: [Age of Reason, Common Sense]
3.2 Using Apache Commons Collection
Using the Apache Commons Collection, we can add multiple values to a single key. First, let’s add the library to our project if we are using Maven build by adding the following dependency to our pom.xml
:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> <!-- Use the latest version --> </dependency>
Now, with POM updated, we can create a Map with Lists as values in our class:
public class MultiValuesExampleApacheCommons { public static void main(String[] args) { MultiMap<String, String> multiValueMap = new MultiValueMap<String, String>(); // Add values to a single key multiValueMap.put("berries", "Tomatoes"); multiValueMap.put("berries", "Grapes"); // Add more values to a different key multiValueMap.put("legumes", "Peanuts"); multiValueMap.put("legumes", "Beans"); // Print out Map with Multiple Values System.out.println("" + multiValueMap); } }
In this example, we use the MultiMap
from the Apache Commons Collections to create a map with List
values. We then add multiple values to a single key using the put
method. We can retrieve all values associated with a key using a get
method like this:
// Retrieve values for a key System.out.println("Values for Berries: " + multiValueMap.get("berries")); System.out.println("Values for Legumes: " + multiValueMap.get("legumes"));
Finally, we print out the values in our Map. The output from running the above code is:
{legumes=[Peanuts, Beans], berries=[Tomatoes, Grapes]}
It is important to note that the usage of Apache Commons Collections may change over time, and it is best to always check the latest documentation and version-specific information for the library you are using.
4. Conclusion
In this article, we delved into the idea of creating a HashMap that facilitates the association of multiple values with a single key. We showed code examples using the in-built Java Collections Framework and Third-party libraries such as Guava’s Collections and the Apache Commons Collections. Generally, HashMaps with multiple values for the same key offer an elegant solution for scenarios where one key needs to be associated with multiple values.
In conclusion, using a HashMap with multiple values for the same key in Java is a powerful technique that can enhance the efficiency of data management in our programs. By employing data structures like Map<String, List<String>>
or leveraging libraries such as Guava’s Multimap
and Apache Commons Collections Multimap
, we can efficiently associate and retrieve multiple values for a single key.
5. Download the Source Code
This was an example of Multiple Values for a Single Key in a HashMap in Java.
You can download the full source code of this example here: Multiple Values for a Single Key in a HashMap in Java