同一鍵具有多個值的 HashMap
一、簡介
HashMap
是 Java 編程中廣泛使用的數據結構,它存儲鍵值對,提供基於關聯鍵對值的快速訪問。然而,在某些情況下,我們可能會遇到需要將多個值與單個鍵關聯的場景。
在本教程中,我們將探討如何實現允許多個值與同一鍵關聯的HashMap
。
2. 概述
大多數編程語言中HashMap
的標準實現只允許一個值與每個鍵關聯。當我們遇到需要在同一個鍵下存儲多個值的情況時,我們可以考慮各種方法來應對這一挑戰。
一種常見的解決方案是使用ArrayList
、 LinkedList
或HashSet
等數據結構來存儲每個鍵的多個值。
3.設計具有多個值的HashMap
讓我們首先設計自定義HashMap
類,該類允許多個值與同一鍵關聯。我們將其命名為MultiValueHashMap
。
3.1.班級結構
首先,讓我們看看MultiValueHashMap
類的基本結構:
public class MultiValueHashMap<K, V> {
private final HashMap<K, ArrayList<V>> map = new HashMap<>();
// Methods
// ...
}
在上面的類結構中,我們使用私有HashMap
來存儲鍵及其關聯的值的ArrayLists
。此外,請注意鍵類型 ( K
) 和值類型 ( V
) 是通用的,以使該類能夠靈活地適應各種數據類型。
3.2.為鍵添加值
現在,讓我們實現一個為特定鍵添加值的方法:
public void put(K key, V value) {
map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
}
put
方法將值添加到給定鍵下的map
中。如果該鍵不存在,它將創建一個帶有空列表的新條目,然後將該值添加到該列表中。這使得存儲和管理與映射中同一鍵關聯的多個值變得容易。
3.3.檢索鍵的值
接下來,讓我們實現一個方法來檢索與給定鍵關聯的所有值:
public List<V> get(K key) {
return map.getOrDefault(key, new ArrayList<>());
}
get
方法返回與指定鍵關聯的ArrayList
,如果該鍵不存在,則返回空ArrayList
。
3.4.刪除鍵值對
為了完成我們的實現,我們將添加一個方法來刪除特定的鍵值對:
public void remove(K key, V value) {
map.computeIfPresent(key, (k, v) -> {
v.remove(value);
return v;
});
}
remove 方法將鍵和值作為輸入,並從map
中與該鍵關聯的列表中刪除該值(如果存在)。這是一種管理從映射中特定鍵下存儲的列表中刪除特定值的簡單方法。
4.JUnit測試示例
為了確保MultiValueHashMap
按預期工作,我們應該編寫全面的 JUnit 測試用例。讓我們看幾個測試示例:
@Test
public void given_MultiValueHashMap_whenPuttingAndGettingSingleValue_thenValueIsRetrieved() {
MultiValueHashMap<String, Integer> map = new MultiValueHashMap<>();
map.put("key1", 10);
assertEquals(List.of(10), map.get("key1"));
}
@Test
public void given_MultiValueHashMap_whenPuttingAndGettingMultipleValues_thenAllValuesAreRetrieved() {
MultiValueHashMap<String, String> 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<String, Double> map = new MultiValueHashMap<>();
assertTrue(map.get("nonexistent").isEmpty());
}
@Test
public void given_MultiValueHashMap_whenRemovingValue_thenValueIsSuccessfullyRemoved() {
MultiValueHashMap<Integer, String> 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<Integer, String> map = new MultiValueHashMap<>();
map.put(1, "one");
map.remove(1, "nonexistent");
assertEquals(List.of("one"), map.get(1));
}
在上面的 JUnit 測試示例中,我們驗證了MultiValueHashMap
類在各種場景下的功能,例如為同一鍵添加單個和多個值、檢索現有和不存在鍵的值以及刪除鍵值對。
5. 結論
在本文中,我們探討了實現支持與同一鍵關聯的多個值的HashMap
的概念。此外,我們設計了MultiValueHashMap
類並通過 JUnit 測試示例演示了其用法。
通過使用這種自定義實現,開發人員可以有效地管理單個鍵需要多個值的場景,從而使他們的代碼更加通用和強大。
與往常一樣,本文的完整代碼示例可以在 GitHub 上找到。