如果我们没有任何 haspmap api,如何制作 HaspMap?
4 回答
如果你真的需要自己设计,那么你至少应该读一本关于数据结构和算法的书。
这是一个简单的基于 C++ 向量的HashTable 实现。
只需创建一个具有两个属性(键和值)的类并提供适当的方法。
我赌一把,猜你的意思是HashMap
,你没有HashMap
API 的原因是你使用的是 Java ME。
答案是使用HashTable
...... Java ME 所拥有的,AFAIK。
另一方面,如果这是一个家庭作业问题,并且您被要求从头开始实现自己的哈希表,那么您应该首先阅读哈希表的工作原理。请参阅您的讲义、数据结构教科书……或在 Wikipedia / Google 上查找“哈希表”
哈希映射的基础是:
1)拥有后备存储 - 一个至少与您已经包含的条目数一样大的数组(或等价物)。两个数组,一个用于键,一个用于值,或者一个键值对元组数组(后者可能更好)
2) 决定我们将新键放入哪个键数组索引的函数。通常这将是 key.HashCode()%array.Length - 但如果它已经持有一个密钥并且它不是同一个密钥(通过 key.Equals(),那么你尝试右边的下一个桶,然后下一个,依此类推,直到我们找到一个。只要我们在从哈希映射中删除一个键时执行相反的操作,就可以这样做 - 换句话说,因为这个“滑动键”操作已经完成,因为没有洞,如果我们打了一个洞,我们必须看看是否需要将钥匙滑入其中以填补空隙(例如,不要将任何钥匙滑到比我们要检查的第一个位置更远的地方,否则如果我们可以向左滑,向左滑动)。
3) 现在,要查看 HashMap 中是否存在键,计算我们将它放在哪里并检查该索引。如果它被占用并且等于(),找到它。如果它被占用并且不匹配,请以相同的方式检查右侧的一个。如果它是空的,没有找到它。
4) 一个操作,一个艰难的操作——当我们快要填满时,重建两倍大小的后备存储(我们越接近填满,效率越差,所以你想在你之前加倍填上)。您必须为后备存储分配两倍大的空间,为新存储重新计算旧存储中每个键的位置,复制键和值,丢弃旧存储并安装新存储。