我需要一张带有唯一键的地图,并且还需要存储重复值一次。接口将是Map,但我不希望相同的值多次使用内存。例如:
在像HashMap这样的普通Map实现中,使用value.equals(value')和value.equals(value''),但是值!= value'和值!= value'和值!= value''如果我们:< / p>
put(key1, value);
put(key2, value');
put(key3, value'');
然后该值将被存储三次。
我尝试制作自己的实现,如下所示:
class MyMap2<K, V> extends HashMap<K, V> {
private Map<V, V> values;
public MyMap2() {
values = new HashMap<V, V>();
}
@Override
public V put(final K key, final V value) {
V v = values.get(value);
if (v == null) {
v = value;
values.put(v, v);
}
return super.put(key, v);
}
}
此实现只存储一次值(请注意,我使用的是相同的值)。但是有没有 Map 已经使用get / put O(1)实现了这种数据结构?
请注意,BiMap没用,因为如果重复值会导致错误。
答案 0 :(得分:1)
此实现已经承诺持续时间获取/放置操作。最糟糕的情况是插入一个从未见过的新值。在这种情况下,您将:
values
地图中找到值 - O(1),因为它是HashMap
。values
地图 - O(1)中,因为它是HashMap
。super
- O(1)中,因为它是HashMap
。你找到了一种更好的方法来实现这种逻辑,但不是一个数量级。
编辑:
请注意,put
中的实施可能super
两次,这只是多余的。它可以调整为稍微清洁:
@Override
public V put(final K key, final V value) {
V v = values.get(value);
if (v == null) {
v = value
values.put(v, v);
}
return super.put(key, v);
}
答案 1 :(得分:1)