从 java 中的哈希图中删除值的子集
Removal of subset of values from a hashmap in java
您好,我有一个 Map 变量定义如下:
Map<String,List<Event>> myMap = new HashMap<String,List<Event>>();
假设 (key:value) 对是 (abc:(x1,x2,x3)), (pqr:(x2,x4,x5)) 和 (xyz:(x4,x2,x9)) .
现在,要删除我们将执行 myMap.remove("pqr"),但这会删除整个 (key:value) 对集。
但我想要的是只删除 set(x2,x4,x5) 中的 x5 以便它导致 (pqr:(x2,x4)).
请提供一些有效的方法来帮助我实现这一目标。
myMap.put(key, value) 将更新键值对(和 return 原始值),所以我建议只将您想要的新值放在地图中。
简单:
myMap.get(pqr).remove(x5);
考虑到 ArrayList 的值,您必须获取键的值 "pqr" 并按照上面的回答从 arraylist 中删除数据。
我不知道你是否真的可以做到这一点(意思是配置限制),但你似乎有某种 MultiMap
要求。
我不知道您的完整规格和要求,但为了决定用于存储事件的结构,您必须考虑是否也需要重复 or/and 排序。
关于效率,由于您需要搜索对象(将其删除),我会选择
Map<String, Set<Event>> myMap = new HashMap<String, Set<Event>>();
或 Multimap
来自 Guava。
如果您不关心排序,请在 add/remove
上使用 HashSet<Event>
O(1)
如果需要自然排序,请在 add/remove
上使用 TreeSet<Event>
O(logn)
如果需要插入顺序,请在 add/remove
上使用 LinkedHashSet<Event>
O(1)
注意:如果您接受重复项(这是选择 List
而不是 Set
的充分理由),myMap.get(pqr).remove(x5);
只会删除该对象的第一次出现。如果您需要删除 x5
的每一次出现,那么以下将起作用:
myMap.get(pqr).removeAll(Collections.singleton(x5));
您好,我有一个 Map 变量定义如下:
Map<String,List<Event>> myMap = new HashMap<String,List<Event>>();
假设 (key:value) 对是 (abc:(x1,x2,x3)), (pqr:(x2,x4,x5)) 和 (xyz:(x4,x2,x9)) .
现在,要删除我们将执行 myMap.remove("pqr"),但这会删除整个 (key:value) 对集。 但我想要的是只删除 set(x2,x4,x5) 中的 x5 以便它导致 (pqr:(x2,x4)).
请提供一些有效的方法来帮助我实现这一目标。
myMap.put(key, value) 将更新键值对(和 return 原始值),所以我建议只将您想要的新值放在地图中。
简单:
myMap.get(pqr).remove(x5);
考虑到 ArrayList 的值,您必须获取键的值 "pqr" 并按照上面的回答从 arraylist 中删除数据。
我不知道你是否真的可以做到这一点(意思是配置限制),但你似乎有某种 MultiMap
要求。
我不知道您的完整规格和要求,但为了决定用于存储事件的结构,您必须考虑是否也需要重复 or/and 排序。
关于效率,由于您需要搜索对象(将其删除),我会选择
Map<String, Set<Event>> myMap = new HashMap<String, Set<Event>>();
或 Multimap
来自 Guava。
如果您不关心排序,请在 add/remove
上使用HashSet<Event>
O(1)
如果需要自然排序,请在 add/remove
上使用TreeSet<Event>
O(logn)
如果需要插入顺序,请在 add/remove
上使用LinkedHashSet<Event>
O(1)
注意:如果您接受重复项(这是选择 List
而不是 Set
的充分理由),myMap.get(pqr).remove(x5);
只会删除该对象的第一次出现。如果您需要删除 x5
的每一次出现,那么以下将起作用:
myMap.get(pqr).removeAll(Collections.singleton(x5));