0

我不知道如何将哈希表的大小加倍。这是代码:

private void doubleLength () {
  //Remember the old hash table array and allocate a new one 2 times as big

  HashMap<K,V> resizedMap = new HashMap<K,V>(map.length * 2);

/*Traverse the old hash table adding each value to the new hash table.
 Instead, add it to by applying
 hashing/compression again (compression will be DIFFERENT, because the
 length of the table is doubled, so we compute the same hash value but
 compute the remainder using the DIFFERENT TABLE LENGTH).*/
   for (int i = 0; i < map.length; i++) {
        for (K key : map[i].entry) { //iterator does not work here
                    resizedMap.put(key, map[i].get(key)); //should go here
    }

}

哈希表是 LN 对象的数组,其中 LN 由以下内容定义:

public static class LN<K1,V1> {
   public Map.Entry<K1,V1> entry;
   public LN<K1,V1>        next;

   public LN (Map.Entry<K1,V1> e, LN<K1,V1> n)
   {entry = e; next = n;}
}

我的班级中有一个可迭代对象,但它不允许 map[i].entry.entries()。

public Iterable<Map.Entry<K,V>> entries () {
return new Iterable<Map.Entry<K,V>>() {
  public Iterator<Map.Entry<K,V>> iterator() {
    return new MapEntryIterator();
  }
};
}

我对如何将公共 LN[] 地图的大小加倍感到非常迷茫;

4

2 回答 2

3

HashMap哈希表太满时,它已经调整了自己的大小。您不必调整它的大小。

于 2012-11-16T20:07:19.067 回答
0

您的代码将无法编译。如果您想将地图初始化为两倍大小,则更容易执行此操作(假设map也是Map):

private void doubleLength () {
  //Remember the old hash table array and allocate a new one 2 times as big
  HashMap<K,V> resizedMap = new HashMap<K,V>(map.size()* 2);
  resizedMap.putAll(map);
}

此外,您似乎对事物的访问方式很奇怪。如果您需要遍历地图,它应该看起来像:

for (K key : map.keySet()){
  V value = map.get(key); //get the value from the map
  //do what you need to do
}

现在如前所述,您不需要调整 HashMap 的大小。它已经这样做了。从JavaDocs

HashMap 的实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的桶数,初始容量只是哈希表创建时的容量。负载因子是哈希表在其容量自动增加之前允许达到的程度的度量。当哈希表中的条目数超过负载因子和当前容量的乘积时,对哈希表进行重新哈希(即重建内部数据结构),使哈希表的桶数大约增加一倍。

于 2012-11-16T20:09:20.653 回答