如何迭代和删除 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版本应该很相似。
我有这样的地图,
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版本应该很相似。