diff --git a/core-java-modules/core-java-string-conversions-3/src/main/java/com/baeldung/hashmapmultivalues/MultiValueHashMap.java b/core-java-modules/core-java-string-conversions-3/src/main/java/com/baeldung/hashmapmultivalues/MultiValueHashMap.java new file mode 100644 index 0000000000..5e4faebb05 --- /dev/null +++ b/core-java-modules/core-java-string-conversions-3/src/main/java/com/baeldung/hashmapmultivalues/MultiValueHashMap.java @@ -0,0 +1,29 @@ +package com.baeldung.hashmapmultivalues; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class MultiValueHashMap { + private final HashMap> map; + + // Constructor + public MultiValueHashMap() { + map = new HashMap<>(); + } + + public void put(K key, V value) { + map.computeIfAbsent(key, k -> new ArrayList<>()).add(value); + } + + public List get(K key) { + return map.getOrDefault(key, new ArrayList<>()); + } + + public void remove(K key, V value) { + map.computeIfPresent(key, (k, v) -> { + v.remove(value); + return v; + }); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/hashmapmultivalues/MultiValueHashMapUnitTest.java b/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/hashmapmultivalues/MultiValueHashMapUnitTest.java new file mode 100644 index 0000000000..b330df22df --- /dev/null +++ b/core-java-modules/core-java-string-conversions-3/src/test/java/com/baeldung/hashmapmultivalues/MultiValueHashMapUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.hashmapmultivalues; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.*; + +public class MultiValueHashMapUnitTest { + @Test + public void given_MultiValueHashMap_whenPuttingAndGettingSingleValue_thenValueIsRetrieved() { + MultiValueHashMap map = new MultiValueHashMap<>(); + map.put("key1", 10); + assertEquals(List.of(10), map.get("key1")); + } + + @Test + public void given_MultiValueHashMap_whenPuttingAndGettingMultipleValues_thenAllValuesAreRetrieved() { + MultiValueHashMap map = new MultiValueHashMap<>(); + map.put("key2", "value1"); + map.put("key2", "value2"); + map.put("key2", "value3"); + + assertEquals(List.of("value1", "value2", "value3"), map.get("key2")); + } + + @Test + public void given_MultiValueHashMap_whenGettingNonExistentKey_thenEmptyListIsReturned() { + MultiValueHashMap map = new MultiValueHashMap<>(); + assertTrue(map.get("nonexistent").isEmpty()); + } + + @Test + public void given_MultiValueHashMap_whenRemovingValue_thenValueIsSuccessfullyRemoved() { + MultiValueHashMap map = new MultiValueHashMap<>(); + map.put(1, "one"); + map.put(1, "uno"); + map.put(1, "eins"); + + map.remove(1, "uno"); + assertEquals(List.of("one", "eins"), map.get(1)); + } + + @Test + public void testRemoveNonExistentValue() { + MultiValueHashMap map = new MultiValueHashMap<>(); + map.put(1, "one"); + map.remove(1, "nonexistent"); + assertEquals(List.of("one"), map.get(1)); + } + +}