2012-02-09 2 views
1

Есть ли в любом случае я могу распечатать ключи со значениями, которые имели коллизии? Если у ключа есть два значения, я хочу иметь возможность распечатывать эти значения, как я могу это сделать, что я внутри класса хэш-карты и внося изменения в него.распечатать hashmap collision

+1

* (Я думаю, вы говорите о хэшах столкновений и о значении хешей, сталкивающихся и ** не о «значении», как в парах {ключ, значение}, я прав?) * ... Если по какой-либо причине у вас слишком много коллизий, это может быть из-за плохо выбранного метода * hashCode *: если у вас есть другой объект, отличный от эквивалента, возвращающий один и тот же хеш (это плохо, но это не запрещено), тогда вы можете ухудшить производительность Карты. Вместо того, чтобы модифицировать код различных реализаций карты, вы можете вместо этого написать лучший метод * hashCode * для ваших объектов, отличных от равных, подверженных хешам столкновения ... – TacticalCoder

+0

@ user988052 Я согласен, даже когда я ответил ниже, просто вызовите hashcode и посмотреть, в чем проблема с hashcode ... – yadab

ответ

3

Если ключ имеет два значения ...

В HashMap, ключ не может иметь два значения. Если вы звоните map.put(key,value) с существующим key, старое значение удаляется с карты и возвращается put().

Один способ иметь несколько значений для каждой клавиши: HashMap<K,Collection<V>>. Это автоматически обеспечивает необходимую функциональность, поскольку вы можете просто изучить содержимое коллекции значений после добавления к ней нового элемента.

Существуют также сторонние классы, предоставляющие такие функции, как MultiValueMap.

редактировать:

Если вы говорите несколько ключей, в конечном итоге в том же ведро, то вам нужно изменить HashMap «s put() метод:

public V put(K key, V value) { 
    if (key == null) 
     return putForNullKey(value); 
    int hash = hash(key.hashCode()); 
    int i = indexFor(hash, table.length); 
    if (table[i] != null) { 
     // TODO: there's already something in this bucket 
    } 
    for (Entry<K,V> e = table[i]; e != null; e = e.next) { 
     ... 

(Добавить свой код, где находится линия TODO.)

Вам необходимо внести похожие изменения в putForNullKey() и другие связанные с ним методы, такие как putForCreate().

1

Если вы изменяете класс HashMap, вы должны найти, где список элементов привязан к хэш-массиву и определить, когда в цепочке больше одного.

ОДНАКО, у вас есть хорошая причина для модификации HashMap, и вам лучше изменить пакет и имя класса (на что-то вроде com.my.company.HashMapWithCollisionStatistics) или рискнуть вечным гневом все, кто стоит за вами, чтобы поддерживать Java-код в вашей группе.

+0

LOL. Да, я сделал. «Что происходит вокруг», не хотел бы, чтобы кто-то это делал со мной. – mkuk

0

Просто используйте MultiMap из коллекций google.

0

Зачем вам это нужно? Если вы просто хотите проверить конфликт, тогда вызовите hashcode() для объектов, которые вы пытаетесь сохранить в хэш-карте, не сохраняя их.

Смежные вопросы