我无法弄清楚如何将哈希表的大小加倍。这是代码:
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 []地图的大小翻倍;
答案 0 :(得分:3)
当哈希表太满时,HashMap
已经自行调整大小。您无需调整大小。
答案 1 :(得分: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的一个实例有两个影响其性能的参数: 初始容量和负载系数。容量是数量 哈希表中的桶,而初始容量就是 创建哈希表时的容量。负载系数是a 衡量哈希表在其之前可以获得多长的度量 容量自动增加。当中的条目数 哈希表超出了加载因子和当前的乘积 容量,哈希表重新哈希(即内部数据 重建结构),以便哈希表大约两次 桶的数量。