【问题标题】:How to iterate and remove keys from Map<String , Map<String, Set<String>>>如何从 Map<String , Map<String, Set<String>>> 中迭代和删除键
【发布时间】:2015-12-05 17:15:00
【问题描述】:

我有这样的地图,

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&lt;String&gt; filter; 以这种方式使用值,

filterArray : [2014, 2015]

即先逐个遍历arraylist值,验证arraylist值是否与Hashmap中的任何键匹配。

  • 如果键匹配忽略它。
  • 如果键不匹配,我只想从地图中删除该键。

也就是说,我总是想在 map 中只保留匹配的键,与传递的输入值进行比较。

在这种情况下,因为我以这种方式拥有 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();
    }
}

【问题讨论】:

  • filterArray.equalsIgnoreCase(..) ...我想知道这在您的示例中是如何工作的。你能解释一下吗? (什么是filterArray)

标签: java collections iterator hashmap set


【解决方案1】:

在keySet上使用retainAll():

map.keySet().retainAll(list);

【讨论】:

  • +1 很好的解决方案。如果您需要不区分大小写(从他的数据来看似乎没有必要,但他的示例有),则将无法使用。)。我没有意识到键集更新了原始地图!
【解决方案2】:

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

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

其次,如果您使用的是 Java 8,使用列表推导进行过滤会表现得更好(因为它会自动线程您的比较)并且会更干净。我可以为您尝试做的事情提供常规解决方案,但我对 java 8 列表推导不够熟悉,无法正确完成。

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

java版本应该很相似。

【讨论】:

    猜你喜欢
    • 2013-12-18
    • 2019-01-30
    • 1970-01-01
    • 2018-01-06
    • 2019-08-26
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    相关资源
    最近更新 更多