Java问题中的哈希结构

Java问题中的哈希结构,java,linked-list,stack,hashtable,Java,Linked List,Stack,Hashtable,以下是硬件问题: 此时,您决定为参与者数据实现一个哈希结构,以准备搜索。您将从提供的文件中读取参与者信息;它是一个逗号分隔(CSV)文件。读取每个记录时,为ID字段创建一个哈希表。哈希表的限制是它的大小为5,因此您需要能够处理冲突。应该通过使用ID值的链表来解决冲突(使用堆栈实现)。您的设计应包括以下内容: 指向仅包含以下信息的链表结构的哈希表: 每个哈希桶冲突项将具有以下信息: ID:整数//未来需要的标识符密钥 哈希桶函数/方法: Input constructor://接受一个字符串作为每

以下是硬件问题:

此时,您决定为参与者数据实现一个哈希结构,以准备搜索。您将从提供的文件中读取参与者信息;它是一个逗号分隔(CSV)文件。读取每个记录时,为ID字段创建一个哈希表。哈希表的限制是它的大小为5,因此您需要能够处理冲突。应该通过使用ID值的链表来解决冲突(使用堆栈实现)。您的设计应包括以下内容:

指向仅包含以下信息的链表结构的哈希表:

每个哈希桶冲突项将具有以下信息:

ID:整数//未来需要的标识符密钥 哈希桶函数/方法:

Input constructor://接受一个字符串作为每个参与者的名称和附加信息(您只需要输入数据的ID部分) 哈希函数构造函数:(提示:您只有5个哈希桶,因此该函数可以是一个非常简单的计算。) Pop构造函数 推式构造函数 打印constructor://以显示哈希桶的内容 可交付成果:

一个完整文档化的程序,用于加载哈希表,并将冲突作为链表处理,实现为堆栈 显示程序如何运行和执行的测试计划 一个屏幕截图显示程序加载了数据,并且在加载了所有数据之后,显示了第一个散列存储桶的内容(理想情况下,这是存储桶0)

我相信我已经非常接近了,但是我已经习惯了Python,所以Java语法是我正在努力学习的东西。不管怎样,检查下面的代码,看看我做了什么

我相信问题与我声明哈希表大小的方式有关。在python中,我可以对数组进行索引,并将给定对象添加到数组中的该位置。看来我不能用java来实现这一点。我考虑尝试一个for循环,但没有成功

我觉得我已经很接近了。大部分代码都是由教授提供的,但我自己开发了Stack()类和方法。当我运行它们时,它们确实起作用,我得到了100%的分数

通过我所做的调试,我可以看到我正在初始化一个大小为“size”的数组(在本例中为5)。但是,我不知道如何将键值对分配给给定的Stack()索引

再说一次,我习惯于Python,对java知之甚少,所以我真的认为我不懂java语法

在python中,我只需按照数组[index].append[node]的行进行操作。然后,我可以弹出数组[index],一次显示一个节点

import java.util.Scanner;
import java.io.File;
import java.util.regex.Pattern;

public class ContributorManager {
    public static void main(String [] args) {
        Scanner inputFile = null;
        String name = null;
        String city = null;
        String country = null;
        String phone = null;
        double contribution = 0;
        int id = 0;
        Contributor c = null;
        Node node = null;
        HashTable h = new HashTable(5); 

        //open contributors file
        try {
            inputFile = new Scanner(new File("/Users/Dan/Desktop/contributors.csv"));
            System.out.println("AsdasdfaDSF");
            inputFile.useDelimiter(Pattern.compile("(\\n)|(\\r)|,"));
        }
        catch (Exception e) {
            System.err.println("Error opening file.");
        }

        //create contributors object for each row, and add to the stack
        while (inputFile.hasNext()) {
            name = inputFile.next();
            city = inputFile.next();
            country = inputFile.next();
            phone = inputFile.next();
            contribution = inputFile.nextDouble();
            id = inputFile.nextInt();
            inputFile.nextLine(); //advance to the next line

            c = new Contributor(name, city, country, phone, contribution, id); 
            node = new Node(c);
            //System.out.println(c.hashFunction());
            h.insert(node); //insert node into the hash table
        }

        h.print(); //print the entire hash table
    }
}




contributor.csv

Tim,Murphy,USA,8285557865,200,25
Gordon,Miner,USA,8285551008,150,32
Jean,Bell,USA,8285557503,225,33
Mike,Prather,USA,8285558497,155,34
George ,Pipps,USA,8285557777,100,35
但是,我不知道如何将键值对分配给给定的Stack()索引

堆栈不是数组。不支持索引分配操作,只支持从结构的一端推送和弹出


看起来你的推送和弹出操作有问题?您的代码注释指明了需要执行的操作。如果堆栈不是空的,则循环到末尾

您没有循环,并且似乎正在向后插入堆栈

相反,您可能需要以下类似的内容,非常类似于打印方法

Node n = first;
while (n.next != null) n = n.next;
n.next = newNode;
与弹出类似,当
n.next!=null&&n.next.next==null
以便您可以设置
n.next=null
并将其从列表中弹出

//TODO: loop logic 
Node toPop = n.next;
n.next = null;
return toPop;
但是,我不知道如何将键值对分配给给定的Stack()索引

堆栈不是数组。不支持索引分配操作,只支持从结构的一端推送和弹出


看起来你的推送和弹出操作有问题?您的代码注释指明了需要执行的操作。如果堆栈不是空的,则循环到末尾

您没有循环,并且似乎正在向后插入堆栈

相反,您可能需要以下类似的内容,非常类似于打印方法

Node n = first;
while (n.next != null) n = n.next;
n.next = newNode;
与弹出类似,当
n.next!=null&&n.next.next==null
以便您可以设置
n.next=null
并将其从列表中弹出

//TODO: loop logic 
Node toPop = n.next;
n.next = null;
return toPop;

你的流行方法似乎不合适。if和else语句都做相同的事情。您需要迭代到堆栈的末尾,然后返回并删除最后一个元素您的pop方法似乎关闭了。if和else语句都做相同的事情。您需要迭代到堆栈的末尾,然后返回并删除最后一个元素
Node n = first;
while (n.next != null) n = n.next;
n.next = newNode;
//TODO: loop logic 
Node toPop = n.next;
n.next = null;
return toPop;