2016-07-22 158 views
0

所以我需要编写这个程序,它接收17个包含NFL球队名称和得分的文件(比如一个文件包含所有32个球队的得分,而另一个文件可能包含30个不同得分的30个球队,但是省略两个球队当然)。我的教授向我们提供了一个HashTable实现,它通过在HashTable中的每个占用索引处创建某种LinkedList来处理冲突(我相当缺乏经验,所以如果我没有得到全部该术语是正确的,但希望你知道我的意思)。我已成功导入所有文件和数据,并将其输入到HashTable中,并使用我的教授给予我们的冲突处理。但是,每当我尝试调用任何键的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

进行比较您可以提供运行Driver类main()后在控制台上打印的确切输出吗? – developer

+0

@developer我现在编辑帖子。 – thelonewanderer

回答

0

你在你的代码的一些误区。我可以先读看到的最明显的是:

  • equals==在图的执行情况比较字符串
  • 你把它放在地图之前不要在名称末尾添加一个空格

我看你的代码的主要建议是学会在编写代码的同时开发单元测试。在这种情况下,您应该进行测试,显示HashEntry在您使用HashTable之前已经做了什么,在进行从文件中读取值并将其放入地图之前,还应对其进行彻底测试。或者,如果你使用嘲讽,你可以按照相反的顺序来完成。但最后试图进行测试使得知道发生了什么问题变得更加困难。学习构建单元测试(最好在编写代码之前),这些类型的问题将更容易找到并解决。

+0

感谢您的建议,我一定会将您的建议纳入未来项目的考虑范围,因为我完全明白为什么会有所帮助。所以关于equals方法,我应该将位于“HashTable”中的get方法中的所有布尔表达式更改为.equals(),是否正确? – thelonewanderer

+0

所以我用==替换了==。等于()并删除名称末尾的空格,现在get方法返回每个团队的第一个值,这比我得到的要好得多!非常感谢! – thelonewanderer