簡體   English   中英

推送到列表的哈希圖

[英]pushing to hashmap of lists

我正在嘗試創建一個像這樣的結構:

{
    id1: [item1, item2, item3],
    id2: [item2, item3, item4]
}

跟蹤每個ID具有的項目。

我知道我可以使用以下形式的HashMap<ID, ArrayList<Items>>表實現此目的: HashMap<ID, ArrayList<Items>>

但是,然后我會不斷地先發制人地檢查ID: ArrayList<Items>的存在ID: ArrayList<Items> ,並在推送Item之前,當一個ID不存在時實例化一個新的空數組列表。

我是否可以使用更專門的類來完成這種形式的結構,或者這種檢查是無法避免的。

我想要類似的東西:

entries = new SomeMapListClass<ID, Item>();
entries.put(ID, ...Items); // handles array internally
Items[] = entries.get(ID);

我事先不知道ID,所以我最初無法用空數組填充HashMap。

但是,然后我會不斷地先發制人地檢查ID:ArrayList的存在,並在推送Item之前實例化一個新的空數組列表(當ID不存在時)。

這是完全可以接受的,並且Map界面提供了可以幫助您解決此問題的方法。 例如:

Map<ID, List<Items>> map = new HashMap<>();

map.computeIfAbsent(id, $ -> new ArrayList<>()).add(item);

如此簡單,因為Map#computeIfAbsent返回映射的值(如果存在),或者返回計算的值(如果不存在)。

因此,為回答您的問題,在這種情況下使用Map<ID, List<Items>>非常合適。

實現自己的HashMapList並不復雜:

package stackoverflow;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;

public class HashMapList<T, E> {

private HashMap<T, ArrayList<E>> map = new HashMap<T, ArrayList<E>>();

/* Insert item into list at key */
public void put(T key, E item) {
    if (!map.containsKey(key)) {
        map.put(key,  new ArrayList<E>());
    }
    map.get(key).add(item);
}

/* Insert list of items at key */
public void put(T key, ArrayList<E> items) {
    map.put(key, items);
}

/* Get list of items at key */
public ArrayList<E> get(T key){
    return map.get(key);
}

/* Check if hashMapList contains key */
public boolean containsKey(T key) {
    return map.containsKey(key);
}

/* Check if list at key contains value . */
public boolean containsKeyValue(T key, E value) {
    ArrayList<E> list = get(key);
    if (list == null) return false;
    return list.contains(value);
}

/* Get list of key */
public Set<T> keySet(){
    return map.keySet();
}

@Override
public String toString() {
    return map.toString();
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM