2012-03-13 12 views
0

単体でリンクされたチェーンで、単語とその発生回数をテキストファイルに保持するオブジェクト "pairs"でいっぱいの配列リストを使用してシンボルテーブルを構築しました。私はこれを、ファイル内の単語の数をカウントするFrequencyCounterプログラムに使用する必要があります。Javaハッシュシンボルテーブルの実装

Processed 1215985 words (19 sec; 19710 msec 
Exception in thread "main" java.lang.NullPointerException 

at HashST.hashIndex(HashST.java:60) 
at HashST.get(HashST.java:105) 
at FrequencyCounter.main(FrequencyCounter.java:112) 

私はHashSTに何か問題がありますという考えを持っていると私はそれを望んでいたように、そのは、ArrayListの中でペアを入れていない:HashSTでFrequencyCounterを実行するときに何らかの理由で、私はこのエラーを取得していますに。実装に何が間違っているかについてのご意見は、大変に感謝しています。ここで

は私のコードとFrequencyCounterためのコードです:

import java.util.LinkedList; 
import java.util.ArrayList; 
import java.util.Iterator; 

public class HashST<Key extends Comparable<Key>, Value> implements Iterable<Key> { 
private ArrayList<Pair> chains; 
private int numKeys; 
private int numChains; 


public class Pair 
{ 
    Key key; 
    Value value; 
    Pair(Key k, Value v) 
    { 
     key = k; 
     value = v; 
    } 
    Pair() 
    {} 

    Pair next; 
} 

    /** 
* Initialize an empty HashSt with a default of 64 empty chains. 
*/ 
    public HashST() 
    { 
     this(64); 

    } 

/** 
* Initialize an empty HashST with numChains emptychains. 
* 387911 is a prime number about twice the number of distinct 
* words in the leipzig1M.txt file. 
*/ 
public HashST(int numChains) 
{ 
    this.numChains = numChains; 
    chains = new ArrayList<Pair>(); 

    for(int i = 0; i < numChains; i++) 
    { 
     Pair p = new Pair(null, null); 
     chains.add(p); 

    } 
} 

/** 
* compute the hash index for a key k if the number of 
* chains is N 
*/ 
private int hashIndex(Key k, int N) 
{ 
    return (k.hashCode() & 0x7fffffff) % N; 

} 
/** 
* insert the Pair (k,v) into the appropriate chain and increment 
* the number of keys counter or 
* update the value for k if k is already in the hash table. 
* 
*/ 
public void put(Key k, Value v) { 

    int i = hashIndex(k, numChains); 
    Pair tmp = chains.get(i); 
    if(contains(k)) 
    { 
     while(tmp.next != null) 
     { 
      if(tmp.key == k) 
      { 
       tmp.value = v; 
       return; 
      } 

      tmp = tmp.next; 
     } 
    } 
    else 
    { 
     Pair p = new Pair(k, v); 
     tmp.next = p; 
     numKeys ++; 

    } 




} 

/** 
* return the value for key k if it is in the hash table 
* or else return null if it is not. 
*/ 
public Value get(Key k) { 

    int i = hashIndex(k, numChains); 
    Pair tmp = chains.get(i); 
     while(tmp.next != null) 
     { 
      if(tmp.key == k) 
      { 
       return tmp.value; 

      } 

      tmp = tmp.next; 
     } 


    return null; 

} 

/** 
* remove the pair with key k if it is in the hash table 
* otherwise no change. 
*/ 
public void delete(Key k) { 

    if(contains(k)) 
    { 
     return; 


    } 

} 

/** 
* return true if the hash table contains a pair with key 
* equal to k else return false 
*/ 
public boolean contains(Key k) { 

    return (get(k) != null) ? true : false; 

} 

/** 
* return the number of keys in the hash table 
*/ 
public int size() { 

    return numKeys; 

} 

/** 
* return a LinkedList<Key> containing the keys in the 
* hash table 
*/ 
public Iterable<Key> keys() { 

    LinkedList<Key> l = new LinkedList<Key>(); 
    for(Pair p : chains) 
    { 
     while(p.next != null) 
     { 
      l.add(p.key); 
      p = p.next; 
     } 

    } 


    return l; 
} 

/** 
* return an Iterator<Key> for the keys in the hash table 
*/ 
public Iterator<Key> iterator() { 
    return keys().iterator(); 
} 

} 

そしてここでは、周波数カウンタです:http://algs4.cs.princeton.edu/31elementary/FrequencyCounter.java.html

+0

あなたのクラスは 'HashST'ですが、' FrequencyCounter'は 'ST'オブジェクトを宣言します。 – Jon

答えて

0

あなたのスタックトレースによれば、これはNULLを投げたラインであるように見えるでしょうポインタ:

return (k.hashCode() & 0x7fffffff) % N; 

だから我々つのオブジェクト参照のk、整数定数、およびプリミティブN.どちらも定数も原始的な缶を持っていますnullであれば、ここで参照解除されるのはkだけです。誰かがnull kの値を得ようとしたようです。

+0

また、 'contains()'と 'get()'がどのようにやり取りするかによって引き起こされる可能性があります。 'contains()'は 'get()'が成功すると思われますが、キーがテーブルにない場合は 'null'を返します。代わりに 'get()'が失敗します。これを修正するには、 'get()'に 'null'のチェックを追加するか、' contains() 'がどのように動作するかを変更します。 – VeeArr

+0

私は混乱しています。キーがテーブルにない場合、getはnullを返すと考えました。 – Offspring47

+0

それはしようとしているようですが、それまでにk.hashCode()を呼び出す前にNullPointerExceptionが発生しています。 – Affe