0

所以我有一个哈希映射类,它工作正常,但我希望它打印出如下内容:

1 -> 101 -> 201 (this is a bucket for handling collision) 2
3 - > 103 - > 203
4
5

换句话说,我只想知道如何让我的程序打印出我的哈希表的内容,使其看起来像这样。任何意见或建议将不胜感激。我是哈希映射的新手,所以这很令人困惑。

而且我不知道该怎么做。

如果有帮助,这是我的哈希映射类:

public class HashMap<K, V> {

    private int DEFAULT_CAPACITY = 10;  
    private MapEntry<K, V>[] Hash;  
    private int size;

    public HashMap() {  
        Hash = new MapEntry[DEFAULT_CAPACITY];  
    }  

    public int getHashCode(K key) {  
        int bucketIndex = key.hashCode() % Hash.length;  
        return bucketIndex;  
    }  

    public V get(K key) {  
        if (key == null) {  
            throw new IllegalArgumentException("Null Key!");
        }
        MapEntry<K, V> entry = Hash[getHashCode(key)];  
        while (entry != null && !key.equals(entry.getKey()))   
            entry = entry.getNext();  
        if (entry != null)
            return entry.getValue();
        else
            return null;
    }  

 /**
  * 
  * @param key
  * @param value
  * The put method works by associating the specified value with
  * the given key in the map. 
  * If the key is already in the map, 
  * the old value is replaced with the new one. 
  */


    public void put(K key, V value) {
        int keyBucket = hash(key);

        MapEntry<K, V> temp = Hash[keyBucket];
        while (temp != null) {
            if ((temp.key == null && key == null) 
                    || (temp.key != null && temp.key.equals(key))) {
                temp.value = value;
                return;
            }
            temp = temp.next;
        }

        Hash[keyBucket] = new MapEntry<K, V>(key, value);
        size++;
    }
    /**
     * 
     * @param key
     * @param value
     * The delete method works similarly to the put method. 
     * It locates the desired value in the hash, e,
     * and then it removes e from the bucket, like removing a node
     * from a linked list. 
     * Then it sets the value of e to its next node. 
     * And then it decreases the size of the map. 
     */


    public void delete(K key, V value) {  
        if (key == null) {  
            throw new IllegalArgumentException("Null Key!");
        }

         int keyBucket = hash(key);

            MapEntry<K, V> e = Hash[keyBucket];

            while (e != null) {
                if ((e.key == null && key == null) 
                        || (e.key != null && e.key.equals(key))) {
                    e.value = value;
                    return;
                }
                e = e.next;
            }

            Hash[keyBucket] = new MapEntry<K, V>(key, value);
            size--;
        }


    public void print(){
        //THIS IS WHERE I NEED HELP
    }

    private int hash(K key) {
        if (key == null) {
            return 0;
        } else {
            return Math.abs(key.hashCode() % this.Hash.length);
        }

}   }
4

2 回答 2

0

您需要遍历作为存储桶维护的数组,并在每个位置附加条目的内容。这应该有效:

public void print() {
    final StringBuilder sb = new StringBuilder();
    for (int i = 0; i < Hash.length; i++) {
        sb.append(i).append(" : ");

        MapEntry<K, V> temp = Hash[i];
        while (temp != null) {
            sb.append(temp.key).append(" -> ").append(temp.value).append(" , ");
            temp = temp.next;
        }

        sb.append("\n");
    }
    System.out.println(sb.toString());
}

例如,它会产生以下输出:

0 : 180 -> 0.889234530714529 , 
1 : 
2 : 992 -> 0.11655748287282786 , 
3 : 
4 : 734 -> 0.8213900931007967 , 824 -> 0.8399483889863836 , 554 -> 0.7833733949735435 , 304 -> 0.9461472125123178 , 
5 : 865 -> 0.604963832544362 , 555 -> 0.1889914052365086 , 
6 : 536 -> 0.5835183387314298 , 
7 : 597 -> 0.3846960557011073 , 
8 : 
9 : 

您的put()delete()方法中有一个错误。这应该修复您的 put() 方法:

public void put(K key, V value) {
    int keyBucket = hash(key);

    MapEntry<K, V> temp = Hash[keyBucket];
    while (temp != null) {
        if ((temp.key == null && key == null)
                || (temp.key != null && temp.key.equals(key))) {
            temp.value = value;
            return;
        }
        temp = temp.next;
    }

    final MapEntry<K, V> newEntry = new MapEntry<K, V>(key, value);
    newEntry.next = Hash[keyBucket]; // chain with current entry
    Hash[keyBucket] = newEntry;
    size++;
}
于 2013-04-28T21:18:53.307 回答
0

一方面,您应该覆盖类的 String 返回 .toString() 方法,而不是使用名为 print() 的新 void 方法。

public String toString() {
    return "This is your output.";
}

关于你的问题,我不完全理解你想要打印什么。您只是想为哈希图中的每个条目打印“键”->“值”,还是想实现不同的东西?

于 2013-04-28T21:07:29.773 回答