распечатать коллизию хэш-карт - PullRequest
1 голос
/ 09 февраля 2012

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

Ответы [ 4 ]

3 голосов
/ 09 февраля 2012

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

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

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

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

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

Если вы говорите о нескольких ключах, заканчивающихся в одном сегменте , то вам нужно изменить HashMap '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 голос
/ 09 февраля 2012

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

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

0 голосов
/ 09 февраля 2012

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

0 голосов
/ 09 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...