我有这样的地图,
Map<String, Map<String, Set<String>>> sampleMap = new Map<String, Map<String, Set<String>>>();
这个地图中的数据就是这样,
sampleMap={2014={A=[1, 2], B=[3], 2015={A=[1,2], B=[1,2], 2016={A=[1,2], B=[3,4]}};
我想根据此输入从地图中删除关键字:List<String> filter;
这样的值,
filterArray : [2014, 2015]
,即首先逐个遍历arraylist值,验证arraylist值是否与Hashmap中的任何键匹配。
,即我总是希望只保留地图中匹配的键,与传递的输入值进行比较。
在这种情况下,因为我有这样的arraylist值,[2014,2015],
2014,2015键仅限于我的地图。所以,
删除前的数据:
sampleMap={2014={A=[1, 2], B=[3], 2015={A=[1,2], B=[1,2], 2016={A=[1,2], B=[3,4]}};
重新删除后的数据:
sampleMap={2014={A=[1, 2], B=[3], 2015={A=[1,2], B=[1,2]}};
我试过这种方式,但我只想知道这是正确的approch,还是容易出现任何异常?
Iterator<Map.Entry<String , Map<String, Set<String>>>> iter = sampleMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String , Map<String, Set<String>>> entry = iter.next();
logger.info("Keys : " + entry.getKey());
if (filterArray.equalsIgnoreCase(entry.getKey())) {
iter.remove();
}
}
答案 0 :(得分:6)
在keySet上使用retainAll()
:
map.keySet().retainAll(list);
答案 1 :(得分:0)
似乎合理。我可能会有一些建议。
首先,每当我看到嵌套集合时,我总是想知道那里是否应该有一两个类。如果这是一次性任务,那么不要担心它,但是如果你想重用这段代码,你可能想考虑为你的内部地图/集创建一个类......但是如果它真的很简单那么它就是没什么大不了的。
其次,如果您使用的是Java 8,那么使用列表推导进行过滤会表现得更好(因为它会自动对您的比较进行线程化)并且会更清晰。我可以为你提供你想要做的事情的常规解决方案,但是我对java 8列表推导不够熟悉,不能正确地做到这一点。
clang++
java版本应该非常相似。