如何迭代和删除Map中的键<string,=“”map <string,=“”set <string =“”>&gt;&gt;

时间:2015-09-09 16:14:25

标签: java collections iterator hashmap set

我有这样的地图,

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();
    }
}

2 个答案:

答案 0 :(得分:6)

在keySet上使用retainAll()

map.keySet().retainAll(list);

答案 1 :(得分:0)

似乎合理。我可能会有一些建议。

首先,每当我看到嵌套集合时,我总是想知道那里是否应该有一两个类。如果这是一次性任务,那么不要担心它,但是如果你想重用这段代码,你可能想考虑为你的内部地图/集创建一个类......但是如果它真的很简单那么它就是没什么大不了的。

其次,如果您使用的是Java 8,那么使用列表推导进行过滤会表现得更好(因为它会自动对您的比较进行线程化)并且会更清晰。我可以为你提供你想要做的事情的常规解决方案,但是我对java 8列表推导不够熟悉,不能正确地做到这一点。

clang++

java版本应该非常相似。