Java 创建一个开放的哈希表

Java 创建一个开放的哈希表,java,hashtable,Java,Hashtable,我是一个全新的人,现在我正在为大学写一份代码投标书。我想创建一个开放的哈希表,并编写了以下代码: public class AuDOpenHashTable extends AuDHashTable { private LinkedList<Contact>[] table; public AuDOpenHashTable(int capacity) { super(capacity); this.table = new LinkedList[capacity]

我是一个全新的人,现在我正在为大学写一份代码投标书。我想创建一个开放的哈希表,并编写了以下代码:

public class AuDOpenHashTable extends AuDHashTable {

private LinkedList<Contact>[] table;


public AuDOpenHashTable(int capacity) {
    super(capacity);
    this.table = new LinkedList[capacity];
}

@Override
public void insert(Contact c) {
    int position = hash(c.email);
    if (table[position] == null) {
        table[position] = new LinkedList<>();
    }
    table[position].add(c);
}

@Override
public void remove(Contact c) throws NoSuchElementException{
    int position = hash(c.email);

    if(table[position] != null){
        table[position].remove();
    }
    else{
        throw new NoSuchElementException();
    }
}

@Override
public Contact getContact(String email)throws NoSuchElementException{
    int position = hash(email);
    table[position].getContact(email);

    if(table[position] != null){
        return table[position].get(position);
    }
    else{
        throw new NoSuchElementException();
    }
}
公共类AuDOpenHashTable扩展了AuDHashTable{
私有LinkedList[]表;
公共开放哈希表(整数容量){
超级(容量);
this.table=新链接列表[容量];
}
@凌驾
公共空白插入(联系c){
int position=hash(c.email);
if(表[位置]==null){
表[position]=新的LinkedList();
}
表[位置]。添加(c);
}
@凌驾
public void remove(联系人c)引发NoTouchElementException{
int position=hash(c.email);
如果(表[位置]!=null){
表[position]。删除();
}
否则{
抛出新的NoTouchElementException();
}
}
@凌驾
public Contact getContact(字符串电子邮件)引发NoTouchElementException{
int position=hash(电子邮件);
表[position].getContact(电子邮件);
如果(表[位置]!=null){
返回表[position].get(position);
}
否则{
抛出新的NoTouchElementException();
}
}
}

公共抽象类AuDHashTable{
受保护的内部容量;
公共哈希表(整数容量){
这个。容量=容量;
}
公开摘要无效插入(联系c);
公开摘要作废(联系c);
公开摘要联系人getContact(字符串电子邮件);
受保护的整数散列(字符串s){
int hash=0;
对于(int i=0;i
}


因此,我的问题在于“getContact()”方法。如果我想在某个职位上显示一个帐户,并且它是该职位上的唯一帐户,那么一切都正常。但是,如果想要显示一个头部不同于尾部的帐户,那么有两个帐户,它只会给我一个帐户(大部分不是正确的)。对于这些示例,代码运行得非常好,但是如果我决定选择其他名称,有时它也不起作用。但为了不让事情复杂化,我想听听你对如何改进“getContact”方法的建议。感谢您的帮助。

散列函数将告诉您项目可以位于哪个存储桶中,但您仍然需要检查存储桶中的所有项目是否相等
getContact
应在LinkedList上迭代并根据每个联系人检查电子邮件,然后仅返回带有匹配电子邮件的联系人。对于
remove
方法也是如此。

散列函数将告诉您一个项目可以位于哪个bucket中,但您仍然需要检查bucket中的所有项目是否相等
getContact
应在LinkedList上迭代并根据每个联系人检查电子邮件,然后仅返回带有匹配电子邮件的联系人。对于
remove
方法也是如此。

不同的键可以具有相同的哈希代码。这是在插入时检测到的,在这种情况下,通常会有一个重新哈希,一些算法来生成另一个哈希代码,这会导致另一个可能是免费的has代码。如果不是免费的,它将再次被刷新。如果这种情况持续很长时间,那么可能会将表分配给较小的表,并且应该使用较大的表


检索信息时,应将索引处的数据与搜索的键进行比较。如果不匹配,请重新刷新(与insert的算法相同),然后重试。直到您找到它或在一个空索引中结束,在这种情况下,键不在那里。

不同的键可以具有相同的哈希代码。这是在插入时检测到的,在这种情况下,通常会有一个重新哈希,一些算法来生成另一个哈希代码,这会导致另一个可能是免费的has代码。如果不是免费的,它将再次被刷新。如果这种情况持续很长时间,那么可能会将表分配给较小的表,并且应该使用较大的表


检索信息时,应将索引处的数据与搜索的键进行比较。如果不匹配,请重新刷新(与insert的算法相同),然后重试。直到您找到它或在一个空索引中结束,在这种情况下,键不在那里。

使用java.util.HashMap。这是正确的,快速的,经过战斗考验的。不要重新发明轮子。你的代码不可能工作,因为你假设只有一封电子邮件总是有相同的哈希值,并且在获取、添加和删除联系人时不需要比较电子邮件。我也想到了这一点,但遗憾的是,我不得不这样使用它(我的大学要求我这样做)。我唯一能改变的就是方法体。但还是要谢谢你。使用java.util.HashMap。这是正确的,快速的,经过战斗考验的。不要重新发明whee
public abstract class AuDHashTable {

protected int capacity;
public AuDHashTable(int capacity){
    this.capacity = capacity;
}

public abstract void insert(Contact c);

public abstract void remove(Contact c);

public abstract Contact getContact(String email);

protected int hash(String s){
    int hash = 0;

    for(int i = 0; i < s.length(); i++){
        hash += s.charAt(i);
    }

    hash = hash % capacity;
    return hash;
}

public static void main(String[] args) {

    AuDClosedHashTable hashtabelle = new AuDClosedHashTable(3);
    Contact eins = new Contact("hans.peter@web.de");
    Contact zwei = new Contact("selina.meier@gmail.com");
    Contact drei = new Contact("alexander.bauer@gmx.de");

    hashtabelle.insert(eins);
    hashtabelle.insert(zwei);
    hashtabelle.insert(drei);


    System.out.println(hashtabelle.isFull());
    System.out.println(hashtabelle.getIndexOf("hans.peter@web.de"));
    System.out.println(hashtabelle.getIndexOf("selina.meier@gmail.com"));
    System.out.println(hashtabelle.getIndexOf("alexander.bauer@gmx.de"));


    hashtabelle.remove(drei);
    System.out.println(hashtabelle.isFull());
    System.out.println(hashtabelle.getContact("selina.meier@gmail.com"));
    System.out.println(hashtabelle.getContact("hans.peter@web.de"));
    System.out.println(hashtabelle.getContact("alexander.bauer@gmx.de"));

    AuDOpenHashTable hashtabelle = new AuDOpenHashTable(3);
    Contact eins = new Contact("hans.peter@web.de");
    Contact zwei = new Contact("selina.meier@gmail.com");
    Contact drei = new Contact("alexander.bauer@gmx.de");

    hashtabelle.insert(eins);
    hashtabelle.insert(zwei);
    hashtabelle.insert(drei);

    System.out.println(hashtabelle.getContact("selina.meier@gmail.com"));

    hashtabelle.remove(zwei);

    System.out.println(hashtabelle.getContact("selina.meier@gmail.com"));
}