Мне нужна карта с уникальными ключами, а также сохранение повторяющихся значений только один раз. Интерфейс будет картой, но я не хочу, чтобы одно и то же значение использовало память несколько раз. Например:
В обычной реализации Map, такой как HashMap, предполагается, что value.equals(value') и value.equals(value''), но value!=value' и value!=value' и value!=value'', если мы:
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 бесполезен, так как это вызовет ошибку в случае дублирования значений.
code
code
- person user3698770   schedule 14.05.2015mymap.put("hello","world")
иmymap.put("hi","world")
, и обе пары ключ-значение были сохранены. Ваш код не делает то, что вы хотите. - person ktorn   schedule 14.05.2015values.get(value)
всегда возвращаетnull
, даже если значение уже должно быть на карте. Даже после переопределенияequals
в тестируемом классе. Это на самом деле странно. - person ktorn   schedule 14.05.2015new Person("name")
. Затем создайтеperson1
,person2
,person3
с тем же именем. Затем добавьте их все на свою карту с разными ключами. Эти 3 человека могут иметь одно и то же имя (вы даже можете переопределитьequals
, чтобы гарантировать, чтоperson1.equals(person2)
но ваша карта будет хранить разные объекты (в 3 раза больше памяти), а не несколько ссылок на один и тот же объект (в 1 раз больше памяти). - person ktorn   schedule 14.05.2015equals
, так иhashCode
, тогда это сработает. - person ktorn   schedule 14.05.2015