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()andメソッドにバグがあり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 に答える