2016-07-22 2 views
0

NFLのチーム名と得点を含む17のファイルを受け取るこのプログラムを書く必要があります(1つのファイルには32チームすべてのスコアが含まれていますが、別のファイルには同じチームのうち30チームに対して30のスコアが含まれます)もちろん)。私の教授は、HashTableの実装を提供してくれました。ハッシュテーブル内の各インデックスにLinkedListを作成して衝突を処理しています(私はかなり経験がないので、正しい言葉ですが、うまくいけば私が何を意味するか知っています)。私は正常にすべてのファイルとデータをインポートし、私の教授が私たちに与えた衝突処理でハッシュテーブルにそれらを入力しました。しかし、私がキーのいずれかのgetメソッドを呼び出そうとするたびに、 "null"を返します。どうしてこれなの?各チームの平均チームスコアを見つける必要があるため、getメソッドがnullを返すため、これを行うことができません。どんな助けでも大歓迎です!Java HashTable実装のgetメソッドはnullを返しますか?

コード:

HashEntry:

public class HashEntry 
{ 
private String key; 
private Double value; 
private HashEntry next; 

public HashEntry(String key, Double value) 
{ 
    this.key = key; 
    this.value = value; 
} 

public String getKey() 
{ 
    return key; 
} 

public void setKey(String key) 
{ 
    this.key = key; 
} 

public Double getValue() 
{ 
    return value; 
} 

public void setValue(Double value) 
{ 
    this.value = value; 
} 

public HashEntry getNext() 
{ 
    return next; 
} 

public void setNext(HashEntry next) 
{ 
    this.next = next; 
} 

public boolean isNextEmpty() 
{ 
    if(next.equals(null)) 
     return true; 
    return false; 
} 

ハッシュテーブル:

public class HashTable implements StringHashTable 
{ 
private HashEntry[] dataArray; 
private int size; 

public HashTable() 
{ 
    dataArray = new HashEntry[1000]; 
    size = 0; 
} 

private int hash(String key) 
{ 
    int sum = 0; 
    for(int i = 0; i < key.length(); i++) 
     sum += (int)key.charAt(i); 

    return sum % dataArray.length; 
} 

@Override 
public void put(String key, Double value) 
{ 
    HashEntry entry = new HashEntry(key, value); 
    int indexToPut = hash(key); 
    HashEntry cursor = dataArray[indexToPut]; 
    if(cursor != null) 
    { 
     while(cursor.getNext() != null && cursor.getKey() != key) 
     { 
      cursor = cursor.getNext(); 
     } 
     if(cursor.getKey() != key) 
     { 
      cursor.setNext(entry); 
     } 
     else 
     { 
      cursor.setValue(value); 
     } 
    } 
    else 
    { 
     dataArray[indexToPut] = entry; 
    } 
    size++; 
} 

@Override 
public Double get(String key) 
{ 
    int indexToGet = hash(key); 
    HashEntry cursor = dataArray[indexToGet]; 
    while(cursor != null && cursor.getKey() != key) 
    { 
     cursor = cursor.getNext(); 
    } 
    if (cursor == null) 
    { 
     return null; 
    } 
    return cursor.getValue(); 
} 

@Override 
public int size() 
{ 
    return size; 
} 

@Override 
public void remove(String key) 
{ 
    int indexToRemove = hash(key); 
    HashEntry cursor = dataArray[indexToRemove]; 
    HashEntry prev = null; 
    while(cursor != null && cursor.getKey() != key) 
    { 
     prev = cursor; 
     cursor = cursor.getNext(); 
    } 
    if (cursor != null) 
    { 
     if (prev == null) 
     { 
      dataArray[indexToRemove] = cursor.getNext(); 
     } 
     else 
     { 
      prev.setNext(cursor.getNext()); 
     } 
     size--; 
    } 
} 

public String toString() 
{ 
    String res = ""; 
    for(HashEntry entry : dataArray) 
    { 
     if (entry != null) 
     { 
      HashEntry cursor = entry; 
      while(cursor != null) 
      { 
       res += cursor.getKey() + " = " + cursor.getValue() + "\n"; 
       cursor = cursor.getNext(); 
      } 
     } 
    } 
    return res; 
} 

ドライバクラス:

public class Project3 
{ 
static HashTable table = new HashTable(); 
static HashMap<String, Double> table1 = new HashMap<String, Double>(); 
public static void main(String[] args) throws IOException 
{ 
    //HashTableImpl<String, Double> table = new HashTableImpl<String, Double>(); 

    if (args.length < 1) 
    { 
     System.out.println("Error: Directory name is missing"); 
     System.out.println("Usage: java scoreProcess directory_name"); 
     return; 
    } 

    File directory = new File(args[0]); // args[0] contains the directory name 
    File[] files = directory.listFiles(); // get the list of files from that directory 

    File file; 
    Scanner input; 

    // process the arguments stores in args 
    for (int i = 0; i < files.length; i++) 
    { 
     input = new Scanner(files[i]); 

     //System.out.println("\nCurrent file name: " + files[i].getName()); 

     // no error checking done here, add your own 
     String name; 
     Double score; 
     while(input.hasNext()) 
     { 
      name = ""; 
      while(!input.hasNextDouble()) 
      { 
       name += input.next() + " "; 
      } 
      score = input.nextDouble(); 
      //System.out.println("Name: " + name + " Score: " + score); 
      table.put(name, score); 
      table1.put(name, score); 
     } 
    } 
    System.out.println("\n"); 
    System.out.println(table.toString()); 
    System.out.println(table.size()); 
    //System.out.println(table1.toString()); 
    System.out.println(table.get("Minnesota")); 
} 
} 

ドライバ出力: https://drive.google.com/file/d/0BwujWiqVRKKsNW52N1M2UllCeHc/view?usp=sharing

テキスト・ファイル例:あなたは、あなたのコード内のエラーの数を持っている

New England 27 
Indianapolis 24 
Tennessee 17 
Miami 7 
St. Louis 17 
Arizona 10 
Seattle 21 
New Orleans 7 
NY Jets 31 
Cincinnati 24 
Pittsburgh 24 
Oakland 21 
Washington 16 
Tampa Bay 10 
San Diego 27 
Houston 20 
Jacksonville 13 
Buffalo 10 
Detroit 20 
Chicago 16 
Cleveland 20 
Baltimore 3 
Atlanta 21 
San Francisco 19 
Philadelphia 31 
NY Giants 17 
Minnesota 35 
Dallas 17 
Denver 34 
Kansas City 24 
Green Bay 24 
Carolina 14 
+0

文字列を==と比較している場合は、等価と比較する必要があります。 – garnulf

+0

ドライバクラスmain()を実行した後、コンソールに表示される正確な出力を提供できますか? – developer

+0

@developer今投稿を編集します。 – thelonewanderer

答えて

0

。私は最初の読み取りで見ることができる最も明白なは以下のとおりです。

  • は、あなたがマップにそれを置く前に、名前の末尾にスペースを追加しないマップ
  • の実装ではequalsない==で文字列を比較します

あなたのコードを見て私の主なアドバイスは、あなたのコードを書くと一緒にユニットテストを開発することを学ぶことです。この場合、HashEntryが、HashTableで使用する前に期待していることを示すテストが必要です。ファイルから値を読み込んでマップに入れる前に、十分にテストする必要があります。または、モッキングを使用する場合は逆の順序で行うことができます。しかし、最後にテストしようとすると、何が間違っているのかを知ることがずっと難しくなります。単体テストを作成することをお勧めします(コードを書く前に行うことをお勧めします)。これらのタイプの問題は、簡単に見つけて解決することができます。

+0

アドバイスをありがとう、私は間違いなくそれがなぜ役立つかを見ることができるので、将来のプロジェクトのためにあなたのアドバイスを考慮に入れています。だからequalsメソッドに関しては、 "HashTable"にあるgetメソッドのすべてのブール式を.equals()に変更する必要があります。 – thelonewanderer

+0

だから私は==をで置き換えました。equals()を呼び出し、名前の最後のスペースを削除して、getメソッドは各チームの最初の値を返します。これは私が得たものよりはるかに優れています!どうもありがとうございます! – thelonewanderer

関連する問題