【问题标题】:Removing element of a Map inside a TreeMap删除 TreeMap 中的 Map 元素
【发布时间】:2018-10-30 13:51:30
【问题描述】:

我有这个结构

TreeMap<String,Map<String,String>> map;

我想删除一个键找到的 Map 中的键值对之一。 我试过了:

map.get(key).remove(key2);

但它会抛出 NullPointerException。 要找到我尝试过的问题:

Map<String,String> aux = map.get(key);
aux.remove(key2);

并看到 map.get 只返回 null。

有什么解决办法吗? 提前谢谢!

【问题讨论】:

  • 好吧,如果map.get(key) 返回null,这意味着外部映射中没有该键的元素 - 就这么简单。如果您认为元素应该在地图中,我们需要查看一些示例,即您将哪些数据放入地图中,您使用什么来查找元素以及您是否提供了自定义比较器。
  • @Thomas 不是那么简单。 TreeMap 支持 null 值,所以 null 并不意味着没有映射。可能有一个映射foo -&gt; null
  • @Michael,好吧,“该键没有元素”并不是说是否存在映射。我想说null 不是 一个元素,所以即使null 被映射,该键也没有元素。
  • @Thomas 对不起,但客观上你错了。在具有到 null 的映射和没有映射之间存在功能差异。如果我有一个到 null 的映射,containsValue(null) 将返回 true。如果我不这样做,它就不会。如果我有一个到 null 的映射,values() 集合将包含 null。如果我不这样做,它就不会。如果我有一个到 null 的映射,则值的键的 getKey 将返回 true。如果我不这样做,它将返回 false。这基本上正是添加Optional 的原因。
  • @Michael 你是对的,尤其是为什么Optional 会在这里有所帮助。但是,这取决于您是否将null 视为一个元素。在 OP 的情况下,键是否映射到 null 或条目根本不存在都没有关系。在任何情况下map.get(key) 都会返回null。从这个意义上说,它实际上很简单:该键没有有意义的值/元素。原因不是那么简单,即没有映射或 null 已放入映射中 - 这就是 Optional 派上用场的地方(如果您需要以不同方式处理这两种情况)。

标签: java dictionary treemap


【解决方案1】:

您可以检查外部映射中是否存在外部键(在本例中为 key),并仅在存在时调用第二个 get

Map<String,String> outerKey = map.get(key);
if(outerKey != null) {
    outerKey.remove(key2)
}

您会得到NullPointerException,因为键key 不存在于外部映射中(或映射到空值),所以map.get(key) 返回空值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2015-07-18
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    相关资源
    最近更新 更多