【问题标题】:Java, remove any given key from a hierarchical mapJava,从分层映射中删除任何给定的键
【发布时间】:2015-03-11 01:30:41
【问题描述】:

假设我有一个 Java 地图:

[
"Level 1.1":"Value1.1",
"Level 1.2":[
    "Level2.1":"Value2.1"
    "Level2.2":[
     "Level3.1":"Value3.1"
    ]
 ]
]

所有级别的键都是唯一的。可以在每个级别更改键的顺序。它可能有超过三个级别。

我想创建一个名为 removeKey() 的方法。它的作用是接受一个参数或参数列表,并遍历此映射并在所有级别删除该键。

例如,调用 removeKey("Level3.1") 将删除向下第三层的那个键,左边的地图将是:

[
"Level 1.1":"Value1.1",
"Level 1.2":[
    "Level2.1":"Value2.1"
    "Level2.2":[
    ]
 ]
]

调用 removeKey("Level3.1", "Level 2.2") 会导致:

[
"Level 1.1":"Value1.1",
"Level 1.2":[
    "Level2.1":"Value2.1"
 ]
]

你能帮我定义方法吗?

谢谢大家。

【问题讨论】:

  • 是的,如果您向我们展示您到目前为止所获得的...
  • 你能告诉我们地图的声明吗?该值有时是字符串,有时是地图。您是否已将其声明为Map<String,Object>
  • Keys at all level are mostly unique - HashMap 中的键必须是唯一的
  • 您已将其标记为“hashmap”,这让我担心您还会谈论键的 顺序,因为普通的哈希映射是无序的。鉴于您的一些值是地图,而有些是普通值,因此也不清楚地图的类型是什么。你能展示一些 Java 代码来设置它吗?
  • @nzsquall:您是否对 HashMap 中的值感到困惑/困惑?如果您已声明 Map,那么我对您的提示将是递归。

标签: java hashmap


【解决方案1】:

下面是一个递归函数,它将从地图的所有级别中删除键。

public static void removeKey(Map<String, Object> levels, String ... keys) {
    if (levels == null
            || (levels != null && levels.size() == 0)) {
        return;
    }

    for (String k : keys) {
        levels.remove(k);
    }

    for (String key : levels.keySet()) {
        if (levels.get(key) instanceof Map) {
            removeKey((Map<String, Object>) levels.get(key), keys);
        } 
    }
}

【讨论】:

  • 不错的解决方案。 if (levels == null || levels.size() == 0) 应该足够了...此外,遍历 levels.entrySet() 将节省您在正文中的几个 .get 调用:)
猜你喜欢
  • 2012-04-19
  • 1970-01-01
  • 2013-10-30
  • 2016-09-15
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 2011-11-27
相关资源
最近更新 更多