整数键中的javascript哈希映射

时间:2010-06-26 12:18:39

标签: javascript hashmap

我在javascript&编码我需要HashMap类型结构。 通常当我需要hashmaps时,我只会使用关联数组(将字符串作为键)。 但这次我需要整数作为哈希图的关键。

因此,如果我尝试存储A [1000] = obj,则创建1001大小的数组& A [1001]作为对象。 即使我尝试A [“1000”] = obj,它仍然会分配1001个空格&用undefined填充它们。

我不想那样,因为我的钥匙可能非常大(大约1磨)。 我可以用它作为A [“dummy1000”] = obj,但我不想使用这种脏方法。

无论如何要优雅地做到这一点。也很轻松?

2 个答案:

答案 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;
  }
}

免责声明:未对代码进行测试。