如何迭代和删除 Map<String , Map<String, Set<String>>> 中的键

How to iterate and remove keys from Map<String , Map<String, Set<String>>>

我有这样的地图,

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]}};

我试过这种方法,但我只想知道这是正确的方法,还是容易出现任何异常?

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

在键集上使用 retainAll()

map.keySet().retainAll(list);

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

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

其次,如果您使用的是 Java 8,则使用列表理解进行过滤会执行得更好(因为它会自动对您的比较进行线程化)并且会更清晰。我可以为您提供 groovy 解决方案,但我对 java 8 列表理解不够熟悉,无法正确完成。

def filteredStructure=structure.findAll{entry->entry.key.equalsIgnoreCase("2014") || entry.key.equalsIgnoreCase("2015"))

java版本应该很相似。