[英]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.