【问题标题】:Hash Table insert哈希表插入
【发布时间】:2015-06-25 13:52:20
【问题描述】:

我不明白这段代码,向数组(哈希表)插入一个新元素 我知道如果它是空的,那么我们添加新元素,我们返回null(因为之前的值是null)。

但是我不明白while(e != null && !e.key.equals(c)),意思是虽然它不为空并且key不等于我们要添加的那个?它不应该是相等的吗,因为我们使用indiHash(c) 来找到我们添加新元素的数组中的位置,所以如果在同一个桶中它们应该有相同的键:然后我们去下一个,这意味着我们要将该元素添加到存储桶列表的完整末尾?我也不明白

valuebefore = e.valor;
e.valor = v;

我们要返回什么?在我们添加新元素之前,桶列表中最后一个元素的值?

我不明白怎么会有if (e != null),因为就在之前,在while循环中,当我们离开循环时,我们确保e为空

public V insert(C c, V v) {

    V valuebefore = null;
    int position = indiHash(c);
    EntryHash<C, V> e = Array[pos];

    while (e != null && !e.key.equals(c))
        e = e.next;

    if (e == null) { 
        Array[position] = new EntryHash<C,V>(c, v, Array[position]);
        size++;
    } else { // 
        valuebefore = e.valor;
        e.valor = v;
    }
    return valuebefore;
}

【问题讨论】:

    标签: java hash


    【解决方案1】:

    许多不同的对象可以有相同的哈希码。即使它们没有相同的值,由于数组的长度远小于 2^32(可能的不同哈希码的数量),具有不同哈希码的对象最终会在同一个桶中。

    因此,最终位于同一存储桶中的对象将存储在条目的链接列表中。上面的代码试图在这个链表中找到一个键等于插入键的条目。如果没有找到,则创建一个新条目并将其添加到链接列表中。否则,与找到的条目关联的值将被新值替换。

    【讨论】:

    • 但是 while (e != null && !e.key.equals(c)) 的字面意思是什么?虽然 e 是“空”并且 c 与 e 的键不同,但它会在链表中查找下一个元素?我认为在那个特定的链表上,它们都有相同的键,因为它们都有相同的哈希码,这就是为什么它们在同一个数组中
    • 字面意思是“在 e 不为空且 e 中的键与 c 不同时继续循环”。或者,如果您愿意,“只要 e 为空或 e 中的键等于 c,就停止循环”。不,正如我的回答所解释的那样,您认为是错误的。假设键是整数,数组的大小是 15。0 将有 0 作为 hashCode。 0 模 15 将是存储桶索引。所以它将进入存储桶 0。30 将有 30 作为 hashCode。 30 模 15 将是存储桶索引。所以它也会进入bucket 0,即使它没有与0相同的hashCode,也不等于0。
    • so valuebefore = e.valor; e.valor = v;在 e 不为 null 且 e 中的键等于 c 的情况下执行?以及为什么他们执行 e.valor = v?有什么意义?
    • 重点是用新值替换旧值。这就是该方法的重点:在地图中插入一个值后,您希望该值在地图中。
    • 但是我们是否将它添加到链表的末尾?在添加新值之前返回最后一个值有什么意义?
    猜你喜欢
    • 2017-03-28
    • 1970-01-01
    • 2015-06-10
    • 2014-11-01
    • 2023-03-04
    • 2015-11-08
    • 2015-03-07
    • 2015-04-11
    相关资源
    最近更新 更多