2016-07-22 3 views
0

Итак, мне нужно написать эту программу, которая получает 17 файлов, содержащих имена и баллы NFL (например, один файл содержит оценки для всех 32 команд, а другой файл может содержать 30 разных баллов для 30 из тех же команд, но без двух команд конечно). И мой профессор предоставил нам реализацию HashTable для использования, и он обрабатывает столкновения, создавая какой-то LinkedList для каждого занятого индекса в HashTable (я довольно неопытен, поэтому мне жаль, если я не получу все терминология правильная, но, надеюсь, вы знаете, что я имею в виду). Я успешно импортировал все файлы и данные и ввел их в 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; 
} 

HashTable:

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; 
} 

Driver Класс:

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, я должен изменить все булевы выражения в методе get, находящемся в «HashTable», на .equals(), правильно? – thelonewanderer

+0

Итак, я заменил == с.equals() и удалил пробел в конце имени, и теперь метод get возвращает первое значение для каждой команды, что намного лучше, чем то, что я получаю! Спасибо огромное! – thelonewanderer