创建一个Open Hashtable

时间:2016-01-03 18:06:36

标签: java hashtable

我是全新的,现在我正在为大学编写代码。我想创建一个开放的哈希表,我写了这段代码:

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

}

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

}

所以,我的问题在于“getContact()”方法。如果我想在某个位置显示一个帐户,并且它只是该位置的帐户,那么一切正常。但是,如果想要显示一个头部与尾部不同的帐户,那么有两个帐户,它只给我一个帐户(大多数不是正确的帐户)。对于这些示例,代码运行良好,但如果我决定选择其他名称,有时它也不起作用。但是为了不复杂,我想听听你对如何改进“getContact”方法的建议。在预先感谢。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

检索信息时,应将索引处的数据与搜索到的密钥进行比较。如果不匹配,则重新进行(与插入相同的算法)并再次尝试。直到你找到它或以空索引结束,在这种情况下密钥不存在。