我在javascript&编码我需要HashMap类型结构。 通常当我需要hashmaps时,我只会使用关联数组(将字符串作为键)。 但这次我需要整数作为哈希图的关键。
因此,如果我尝试存储A [1000] = obj,则创建1001大小的数组& A [1001]作为对象。 即使我尝试A [“1000”] = obj,它仍然会分配1001个空格&用undefined填充它们。
我不想那样,因为我的钥匙可能非常大(大约1磨)。 我可以用它作为A [“dummy1000”] = obj,但我不想使用这种脏方法。
无论如何要优雅地做到这一点。也很轻松?
答案 0 :(得分:7)
执行A[1000] = 1
不会创建包含1000个元素的数组。它创建一个长度属性为1001的数组对象,但这只是因为JavaScript数组中的length属性被定义为最大索引+ 1.
它的工作原理是for(var i = 0; i < A.length; i++)
。
我看到你对阵列的分配感到困惑。对你来说,看起来JavaScript已经填充了未定义的元素 - 实际上没有任何东西,但如果你试图访问一个尚未定义的数组中的任何元素,你得到undefined
。
答案 1 :(得分:3)
从密钥创建哈希代码,并将其用作索引。将哈希码限制在一个很小的范围内,这样你就可以获得相当小的桶数。
类似的东西:
function HashMap() {
// make an array of 256 buckets
this.buckets = [];
for (var i = 0; i < 256; i++) this.buckets.push([]);
}
HashMap.prototype.getHash = function(key) {
return key % 256;
}
HashMap.prototype.getBucket = function(key) {
return this.buckets[this.getHash(key)];
}
HashMap.prototype.getBucketItem = function(bucket, key) {
for (var i = 0; i < bucket.length; i++) {
if (bucket[i].key == key) return i:
}
return -1;
}
HashMap.prototype.setItem = function(key, value) {
var bucket = this.getBucket(key);
var index = this.getBucketItem(bucket, key);
if (index == -1) {
bucket.push({ key: key, value: value });
} else {
bucket[index].value = value;
}
}
HashMap.prototype.getItem = function(key) {
var bucket = this.getBucket(key);
var index = this.getBucketItem(bucket, key);
if (index == -1) {
return null;
} else {
return bucket[index].value;
}
}
免责声明:未对代码进行测试。