我正在做一个家庭作业,负责构建一个hashmap数据结构,我不理解给我们的一行代码。在程序中,变量按如下方式启动:
private Map<K,V>[] buckets;
我知道在散列映射中使用桶的概念,但是如何使用映射数组来创建桶?当我看到这段代码时,似乎我需要创建一个哈希映射数组,但这根本没有意义。
如果您需要更多信息,请告诉我们。
非常感谢任何帮助。
以下是提供的代码。
package cs2321;
import net.datastructures.*;
public class HashMap<K, V> implements Map<K, V> {
private Map<K,V>[] buckets;
protected final int mDefaultHashSize = 1021;
/**
* Constructor that takes a hash size
* @param hashsize The number of buckets to initialize
* in the HashMap
*/
public HashMap(int hashsize){
// TODO: Be sure to initialize the bucket array
// using the hashsize given as the number of buckets
}
public HashMap(){
// TODO: Be sure to initialize the bucket array
// using the default hash size provided.
}
public Iterable<Entry<K, V>> entrySet() {
// TODO Auto-generated method stub
return null;
}
public V get(K key) throws InvalidKeyException {
// TODO Auto-generated method stub
return null;
}
public boolean isEmpty() {
// TODO Auto-generated method stub
return false;
}
public Iterable<K> keySet() {
// TODO Auto-generated method stub
return null;
}
public V put(K key, V value) throws InvalidKeyException {
// TODO Auto-generated method stub
return null;
}
public V remove(K key) throws InvalidKeyException {
// TODO Auto-generated method stub
return null;
}
public int size() {
// TODO Auto-generated method stub
return 0;
}
public Iterable<V> values() {
// TODO Auto-generated method stub
return null;
}
}
答案 0 :(得分:1)
这是一个HashMaps数组,用于演示HashMap的工作原理。研究它并告诉我们它是如何工作的以及为什么HashMaps如此广泛使用?
public class Test {
static private Map<String,String>[] buckets;
static int numberOfBuckets = 3;
static public void main(String...strings) {
buckets = new Map[numberOfBuckets];
for (int x=0; x!=numberOfBuckets; x++) {
buckets[x]=new HashMap<String,String>();
}
String s1 = "one ijsiji jdj i";
String s2 = "two ijs42i jdj i";
String s3 = "th3 ijsiji 42j i";
String s4 = "i42 ji jdj i";
buckets[(Math.abs(s1.hashCode()) % numberOfBuckets)].put(s1,"");
buckets[(Math.abs(s2.hashCode()) % numberOfBuckets)].put(s2,"");
buckets[(Math.abs(s3.hashCode()) % numberOfBuckets)].put(s3,"");
buckets[(Math.abs(s4.hashCode()) % numberOfBuckets)].put(s4,"");
for (int x=0; x!=numberOfBuckets; x++) {
System.out.println(buckets[x]);
}
}
}
输出
{two ijs42i jdj i=}
{one ijsiji jdj i=, i42 ji jdj i=}
{th3 ijsiji 42j i=}
答案 1 :(得分:0)
很难准确地说没有看到更广泛的代码库,但根据给出的信息,我怀疑在这种情况下“Map”实际上意味着“MapEntry”或类似的东西,并且地图条目代表键/值对< /强>
请记住,hashmap存储桶需要包含键和值,以便可以区分具有不同键但具有相同哈希值的条目。
请注意,Java中的映射条目通常应符合Map.Entry interface。如果您的案例中使用的“Map”类支持此接口,那么这是一个非常好的线索,它正在扮演这个角色: - )
当然,另一种可能性是它们实际上是代表每个存储桶内容的哈希映射。但出于两个原因,这似乎很奇怪:
我想地图也可能是一种不同类型的地图(可能是红黑树?)但是这也很奇怪 - 通常桶实现会使用数组或链表而不是重量级地图数据结构
更新(代码发布后)
从现在发布的代码中,似乎很清楚意图是最后两个选项之一,即使用另一个映射结构来实现散列映射以表示每个存储桶的内容。由于上面给出的原因,似乎很奇怪,但我认为从模板代码中可以清楚地看出这是预期的。