2014-02-23 4 views
0
public class HashTable <K, V> implements Table<K, V>{ 
    PairHolder table[]; 
    int idx; 
    public HashTable(int size){ 
     table=new PairHolder[size]; 
    } 
    public void put(K key, V value) { 
     int hVal = key.hashCode(); 
     int index = hashFunc1(hVal); 
     int temp = hashFunc2(hVal); 
     int col = index +=temp; 

     while(table[index]!=null){ 
      index += temp; 
      index %=table.length; 
     } 
     table[index].value=value; 

    } 
} 
public int hashFunc1(int key){ 
    int abs = Math.abs(key%table.length); 
    return abs; 
} 

public int hashFunc2(int key){ 
    int abs = Math.abs(5-key%5); 
    return abs; 
} 

해시를 이중화하려고 시도하고 있는데 어떻게해야하는지 혼란 스럽습니다. 나는 옳은 길을 가고 있다고 생각하지만 NullPointerExceptiontable[index].value=value;입니다.해시를 이중화하려고 시도합니다.

도움이 될 것입니다.

+0

'table [0]'의 값은 무엇입니까? –

답변

0

그냥 잠시 냈다 이것에 대해 생각 : NULL 인에 루프

while(table[index]!=null){ 
    index += temp; 
    index %=table.length; 
} 
table[index].value=value; 

무한 table[index] 때까지 진행한다. 정의에 따라 table[index]은 마지막 행을 가져올 때 null이어야하며 역 참조를 시도하면 NullPointerException이 발생합니다.

아마도 이와 같은 것을 의도하셨습니까?

while(table[index]!=null){ 
    index += temp; 
    index %=table.length; 
} 
table[index] = new PairHolder(key,value); 

구현 방법을 명확하게 밝히지 않았습니다. 하지만 당신의 null 포인터를 수정합니다 :

내가이 코드를 "수정", 당신은 왜 다른 스레드에서 포스터는 실제로 두 번 해시하지 않았다고 말했어?

public void put(K key, V value) { 
    int keyInt = key.hashCode(); 
    int hash1 = hashFunc1(keyInt); 
    int hash2 = hashFunc2(keyInt); 

    int index = hash1 % table.lenght; 
    int temp = hash2; 
    //etc etc 
} 

public int hashFunc1(int key){ 
    int abs = Math.abs(key); 
    return abs; 
} 

public int hashFunc2(int key){ 
    int abs = Math.abs(5-key%5); 
    return abs; 
} 
+0

그 문제를 해결하는 가장 좋은 방법은 무엇입니까? – user3277779

+0

그래도 이중 해싱이 맞습니까? – user3277779

+0

4 시간 전에 같은 질문에 대한 답변을 얻었습니다 ... 정말 추가 할 다른 것을 모르겠습니다. http://stackoverflow.com/questions/21963881/double-hashing-java? – Affe