我有一个包含多维哈希图的集合,如下所示:
Set<HashMap<String, HashMap<String, String>>> myHashSet = new HashSet<HashMap<String, HashMap<String, String>>>();
我在删除HashMap条目时遇到问题。我知道顶级hashmap的关键,但不知道底层hashmap中的任何数据。我试图以这些方式删除集合中的hashmap条目:
我
Set<HashMap<String, HashMap<String, String>>> myHashSet = new HashSet<HashMap<String, HashMap<String, String>>>();
... Add some hashmaps to the set, then ...
String myKey = "target_key";
setInQuestion.remove(myKey);
II。
Set<HashMap<String, HashMap<String, String>>> myHashSet = new HashSet<HashMap<String, HashMap<String, String>>>();
... Add some hashmaps to the set, then ...
String myKey = "key_one"; //Assume a hashmap has been added with this top level key
HashMap<String, HashMap<String, String>> removeMap = new HashMap<String, HashMap<String, String>>();
HashMap<String, String> dummyMap = new HashMap<String, String>();
removeMap.put(myKey, dummyMap);
setInQuestion.remove(removeMap);
这两种方法都不起作用。如果我只知道顶级hashmap的密钥,我将如何删除集合中的条目?
答案 0 :(得分:2)
Collection.remove()
需要对象相等。各种jdk Map实现实现相等意味着所有键/值必须匹配。由于您传递给remove()
调用的任何对象都不会与“集合”中的任何地图“相等”,因此不会删除任何内容。
执行所需操作的唯一方法是迭代自己设置以找到匹配的Map(或者将Set设置为键入该特殊键的Map)。
答案 1 :(得分:0)
感谢jtahlborn的指导。想要发布我在你的回答中找到的解决方案:
String myKey = "Key_In_Question";
Iterator mySetIterator = myHashSet.iterator();
while(mySetIterator.hasNext()) {
HashMap<String, HashMap<String, String>> entry = (HashMap<String, HashMap<String, String>>) mySetIterator.next();
if(entry.containsKey(myKey)) {
myHashSet.remove(entry);
}
}
答案 2 :(得分:0)
抱歉,我无法发布此评论作为评论。我想指出,@ jtahlborn关于Map
平等的观点是合同中定义明确的部分......见Map.equals
。
...如果
m1
,则两个地图m2
和m1.entrySet().equals(m2.entrySet())
代表相同的映射。这可确保equals方法在Map
接口的不同实现中正常工作。
Map.Entry.equals
措辞相似。
...如果
,则两个条目e1
和e2
表示相同的映射(e1.getKey()==null ? e2.getKey()==null : e1.getKey().equals(e2.getKey())) && (e1.getValue()==null ? e2.getValue()==null : e1.getValue().equals(e2.getValue()))
这可确保
equals
方法在Map.Entry
接口的不同实现中正常工作。