()) 带对象的树形图,java,collections,treemap"/>

首页 > 解决方案 > 树状图()) 带对象的树形图

问题描述

嗨,我有以下代码

TreeMap mp = new TreeMap<String,TreeMap<String,Integer>();
mp.put(line,(new TreeMap<String,Integer>()));

现在,如果我想将数据插入由“mp”创建的新 EmptyTree<String,Integer>,我该怎么做?

标签: javacollectionstreemap

解决方案


有无数种方法可以做到这一点。

首先,您可以简单地保留参考:

var map = new TreeMap<String,Integer>();
mp.put(line, map);
// can du stuff with map now

其次,您可以从地图中读取值 - 显然这不是很有效,但为了完整起见,我会包括它:

mp.put(line,(new TreeMap<String,Integer>()));
var map = mp.get(line);

最优雅的解决方案是使用computeIfAbsent

var map = mp.computeIfAbsent(line, line -> new TreeMap<String,Integer>());
// do stuff with map

computeIfAbsent返回映射中已经存在的值,或者以其他方式评估 lambda 并将其放入映射中,然后返回该值。

来自 JavaDoc:

如果指定的键尚未与值关联(或映射到null),则尝试使用给定的映射函数计算其值并将其输入到此映射中,除非null.

如果映射函数返回 null,则不记录映射。如果映射函数本身抛出(未经检查的)异常,则重新抛出异常,并且不记录映射。最常见的用法是构造一个新对象作为初始映射值或记忆结果,如下所示:
map.computeIfAbsent(key, k -> new Value(f(k)));

或者实现一个多值映射,Map<K,Collection<V>>每个键支持多个值:
map.computeIfAbsent(key, k -> new HashSet<V>()).add(v);

映射函数不应在计算期间修改此映射

的优点computeIfAbsent是您不需要检查该值是否已经存在于地图中,并且没有覆盖旧值的危险。


推荐阅读