试图理解hashmap数据结构

时间:2012-03-13 04:20:26

标签: java data-structures hashmap

我正在做一个家庭作业,负责构建一个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;
}

}

2 个答案:

答案 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”类支持此接口,那么这是一个非常好的线索,它正在扮演这个角色: - )

当然,另一种可能性是它们实际上是代表每个存储桶内容的哈希映射。但出于两个原因,这似乎很奇怪:

  • 在单个存储桶中使用散列映射没有任何好处,因为您已经知道它们具有相同的散列码
  • 如果你已经有了一个hashmap实现,那么用它来重新实现另一个hashmap会很奇怪。

我想地图也可能是一种不同类型的地图(可能是红黑树?)但是这也很奇怪 - 通常桶实现会使用数组或链表而不是重量级地图数据结构

更新(代码发布后)

从现在发布的代码中,似乎很清楚意图是最后两个选项之一,即使用另一个映射结构来实现散列映射以表示每个存储桶的内容。由于上面给出的原因,似乎很奇怪,但我认为从模板代码中可以清楚地看出这是预期的。