2017-12-08 17 views
1

したがって、私は自分自身でHashMapの実装を作成することができます。私のコード - 以下は最初にArrayのサイズを設定するコンストラクタを呼び出して動作します。次に、リストに追加する単語のハッシュ値を計算します。配列内のその位置に移動し、既に値があるかどうかをチェックします。存在しない場合は、そこに新しいNodeを作成し、nullを指すポインタでデータを追加します。既にそこにセルがある場合、それは新しいセルを作成しますが、ポインタは以前にそこにあったセルを指しており、したがってリンクされたリストを作成します。リンクリストが適切に初期化されていません

私のcountメソッドは、最初に要求された単語のハッシュ値を見つけることによって動作します。次に、そのポイントに存在するリンクされたリストを検索し、値を返します。

public class WordStoreImp implements WordStore{ 

public class Node<T>{ 
    public T data; 
    public Node<T> next; 
    public Node(){ 
    } 

    public Node(T data, Node<T> next) 
    { 
     this.data = data; 
     this.next = next; 
    } 
} 

static Node[] array; 

public WordStoreImp(int n){ 
    array = new Node[n]; 
} 

public void add(String word){ 
    int position = hashFunction(word); 
    if(position<0){ 
     position = position *- 1; 
    } 
    if(array[position] == null){ 
     array[position] = new Node(word, null); 
    }else{ 
     Node newHead = new Node(word, array[position]); 
     array[position] = newHead; 
    } 
} 



public int count(String word){ 
     int number = 0; 
     int position = hashFunction(word); 
     if(position<0){ 
      position = position *- 1; 
     } 
     for(; array[position] != null; array[position] = array[position].next){ 
      if(array[position].data == word){ 
       number++; 
      } 
     } 
     //System.out.println(number); 
     return number; 
    } 

public int hashFunction(String a){ 
    int sum = 1; 
     for(int i = 0; i<a.length(); i++){ 
      char b = a.charAt(i); 
      int value = (int) b; 
      sum *= value; 
    } 
    sum = sum % array.length; 
    if(sum<0){ 
     sum = sum*-1; 
    } 
    return sum; 
} 

public static void main(String[] args) { 
    WordStoreImp a = new WordStoreImp(100); 
    a.addthings("abc", 100); 
    a.count("abc"); 
    a.count("abc"); 
} 
} 

私の問題は、私のカウント方法が動作していないと私は理由を把握することはできませんということです - と0を返します - それは項目が存在する微細で何回返しますが、それは、その後の作業をdosent初めて。私は理由を理解することができません - 誰かが私を正しい方向に向けることができますか?

答えて

0

countメソッドを呼び出すと、リンクされたリストの先頭が変更されます。あなたのforループラインでこれをやっている:

for(; array[position] != null; array[position] = array[position].next){ 

このループが完了したら、あなたは効果的にそれがnullになるまで繰り返しarray[position]を更新することによって、あなたのバケツからすべてのあなたのリンクリストの項目を移動しました。代わりに

array[position]に初期化ローカル変数を使用し、それの代わりarray[position]を更新し、このような何か:また.equalsメソッドを使用して検討する必要があります

for(Node<T> curr = array[position]; curr != null; curr = curr.next){ 
    if(curr.data == word){ 
     number++; 
    } 
} 

==オペレータは、それらが同じオブジェクトであるかどうかを判断し、2つのオブジェクトが必ずしも同じオブジェクトであるとは限りません。

関連する問題