Реализация Java HashTable получает метод, возвращающий значение null?

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

person robertparsons4    schedule 22.07.2016    source источник
comment
Вы сравниваете строки с ==, вы должны сравнивать их с равными   -  person garnulf    schedule 22.07.2016
comment
Можете ли вы предоставить точный вывод, который выводится на консоль после запуска класса драйвера main()?   -  person developer    schedule 22.07.2016
comment
@developer Я сейчас отредактирую пост.   -  person robertparsons4    schedule 22.07.2016


Ответы (1)


У вас есть ряд ошибок в вашем коде. Наиболее очевидные, которые я вижу при первом чтении:

  • сравнить строки с equals, а не == в реализации карты
  • не добавляйте пробел в конце имени, прежде чем поместить его на карту

Мой главный совет вам, глядя на ваш код, — научиться разрабатывать модульные тесты одновременно с написанием кода. В этом случае у вас должны быть тесты, которые показывают, что HashEntry делает то, что вы ожидаете, прежде чем использовать его в HashTable, которые также должны быть тщательно протестированы, прежде чем вы приступите к считыванию значений из файлов и размещению их на карте. Или вы можете сделать это в обратном порядке, если используете насмешку. Но попытка протестировать в конце значительно усложняет понимание того, что пошло не так. Научитесь создавать модульные тесты (желательно до написания кода), и такие проблемы будет намного проще найти и решить.

person sprinter    schedule 22.07.2016
comment
Спасибо за совет, я обязательно учту ваш совет для будущих проектов, так как я полностью понимаю, почему это поможет. Итак, что касается метода equals, я должен изменить все логические выражения в методе get, расположенном в HashTable, на .equals(), правильно? - person robertparsons4; 22.07.2016
comment
Поэтому я заменил == на .equals() и удалил пробел в конце имени, и теперь метод get возвращает первое значение для каждой команды, что намного лучше, чем то, что я получал! Большое спасибо! - person robertparsons4; 22.07.2016