Java 如何迭代并从映射中删除键<;字符串,Map<;字符串,Set<;字符串>&燃气轮机&燃气轮机;

Java 如何迭代并从映射中删除键<;字符串,Map<;字符串,Set<;字符串>&燃气轮机&燃气轮机;,java,collections,iterator,hashmap,set,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]}}; filterArray : [2014, 20

我有一张这样的地图

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]}};
filterArray : [2014, 2015]
我想根据此输入从映射中删除密钥:
列表过滤器以这种方式使用值

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]}};
filterArray : [2014, 2015]
i、 首先逐个遍历arraylist值,验证arraylist值是否与Hashmap中的任何键匹配

  • 如果键匹配,则忽略它
  • 如果密钥不匹配,我只想从地图中删除该密钥
i、 我总是希望在映射中只保留匹配的键,与传递的输入值进行比较

在本例中,由于我使用了这种方式的arraylist值,[20142015]

20142015只在我的地图上显示钥匙。所以,

删除前要保存的数据:

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();
    }
}
Iterator iter=sampleMap.entrySet().Iterator();
while(iter.hasNext()){
Map.Entry=iter.next();
logger.info(“key:+entry.getKey());
if(filterArray.equalsIgnoreCase(entry.getKey())){
iter.remove();
}
}
在键集上使用
retainAll()

map.keySet().retainAll(list);

看起来很合理。我可能有一些建议

首先,每当我看到嵌套集合时,我总是想知道其中是否应该有一两个类。如果这是一个一次性任务,那么不用担心,但是如果您想重用此代码,您可能需要考虑为您的内部映射/集创建一个类。。。但如果真的这么简单,那也没什么大不了的

其次,如果您使用的是Java8,那么使用列表理解进行过滤会执行得更好(因为它会自动执行比较),而且会更干净。我可以为您提供groovy解决方案来解决您正在尝试做的事情,但是我对Java8列表理解不够熟悉,无法正确地完成它

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

java版本应该非常相似。

filterArray.equalsIgnoreCase(..)
。。。我想知道在你的例子中这是怎么回事。你能解释一下吗?(什么是
filterArray
)+1个好的解决方案。如果您需要不区分大小写(从他的数据来看,这似乎没有必要,但他的示例中有)。我没有意识到按键集更新了原始地图!