繁体   English   中英

Java HashTable实现get方法返回null?

[英]Java HashTable Implementation get method returning null?

因此,我需要编写一个程序来接收包含NFL球队名称和得分的17个文件(例如一个文件包含所有32个球队的得分,而另一个文件可能包含30个相同球队的30个不同得分,但是当然要省略两个球队)。 我的教授为我们提供了一个HashTable实现供使用,它通过在HashTable中的每个占用索引处创建某种LinkedList来处理冲突(我经验不足,所以很抱歉,如果我不了解全部信息,术语正确,但希望您理解我的意思)。 我已经成功导入了所有文件和数据,并将它们输入到HashTable中,并使用了教授给我们的冲突处理方法。 但是,每当我尝试为任何键调用get方法时,它都会返回“ null”。 为什么是这样? 我之所以这样问,是因为我需要找到每个团队的平均团队得分,但由于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

您的代码中有许多错误。 初读时最明显的是:

  • 在map的实现中将字符串与equals not ==比较
  • 在将名称放入地图之前,请勿在名称末尾添加空格

我对查看代码的主要建议是学习与编写代码一起开发单元测试。 在这种情况下,您应该进行测试,表明HashEntryHashTable中使用它之前可以达到预期的效果,在继续从文件中读取值并将其放入映射之前,还应该进行彻底的测试。 或者,如果使用模拟,则可以相反的顺序进行。 但是,如果最后进行测试,则很难知道出了什么问题。 学习构建单元测试(最好在编写代码之前),这些类型的问题将更容易发现和解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM