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