Java唯一值映射

时间:2015-05-14 14:21:58

标签: java dictionary data-structures

我需要一张带有唯一键的地图,并且还需要存储重复值一次。接口将是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没用,因为如果重复值会导致错误。

2 个答案:

答案 0 :(得分:1)

此实现已经承诺持续时间获取/放置操作。最糟糕的情况是插入一个从未见过的新值。在这种情况下,您将:

  1. 尝试在values地图中找到值 - O(1),因为它是HashMap
  2. 找不到它,并将值放在values地图 - O(1)中,因为它是HashMap
  3. 将键值对放在super - O(1)中,因为它是HashMap
  4. 你找到了一种更好的方法来实现这种逻辑,但不是一个数量级。

    编辑:
    请注意,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)

已经问过before

查看BiMap