我想要执行以下功能:
if (!map.contains(key)) {
map.put(key, val);
}
更新:我们假设它不是HashMap
所以地图是以某种树形式实现的。
然而请注意,它有点效率低,因为如果我们进入实际上我们实际搜索地图两次。我其实想做类似的事情:
map.put_if_new_key(key, val);
知道怎么用Java做的吗?
答案 0 :(得分:7)
如果您希望绝大部分时间都插入新元素。
ValType temp = map.put(key, val);
if(temp != null)
map.put(key, temp);
我认为这不是一个好主意,但是如果你可以充分说明你的用例,那么值得考虑。
如果您可以使用特定的地图实现而不仅仅是地图界面,那么可以使用NavigableMap
Map sub = map.subMap(key, true, key, true);
if (!sub.contains(key)) {
sub.put(key, val);
}
由于子树将是0或1个节点,因此没有重复的工作。
答案 1 :(得分:3)
如果您有ConcurrentMap<K, V>
,则方法为putIfAbsent
:
如果指定的键尚未与值关联,请将其与给定值相关联。这相当于
if (!map.containsKey(key)) return map.put(key, value); else return map.get(key);
除了动作以原子方式执行。
但Map<K, V>
上不存在此方法。
答案 2 :(得分:1)
我不认为您提出的代码效率低下。查看地图中是否已存在key
,然后查看单个地图查找。即使对于未找到密钥的情况,也没有2次搜索。只有1次搜索,1次插入地图。
答案 3 :(得分:0)
我认为没有办法检查“contains()”以查看密钥是否存在。
看看这里是否可以替代你: