【发布时间】:2016-09-22 11:22:36
【问题描述】:
在我的数据结构和算法课程中,我被分配了以下任务,但我不知道为什么它不起作用。
任务是实现一个链接哈希表。我创建了两个类,一个作为键 值对,代表一个元素(Entry 类),另一个是具有方法的 Hashtable 类(目前只有 put 和 get),但我似乎没有他们去工作。 Hashfunction方法是我们老师提供的,所以我无法回答任何问题。
每当我执行程序时,我都没有收到任何错误,但列表返回空。这里的任何人都可以指导我做错的正确方向吗?我认为错误在于 put 方法,但我似乎无法弄清楚问题可能在哪里。
最好的问候, 维克多
package Laboration2;
/**
* A class that works as a container for the key and value.
* 'Entry' will become an element in our hashtable
*
* @author Victor Marante
* @version 1.0
* @since 2016-09-22
*/
public class Entry {
private Object key;
private Object value;
private Entry next;
public Entry(Object key, Object value) {
this.key = key;
this.value = value;
}
@Override
public boolean equals(Object obj) {
Entry keyToCompare = new Entry(obj, null);
return key.equals(keyToCompare.key);
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public Object getKey() {
return key;
}
public Entry getNext() {
return next;
}
public void setNext(Entry next) {
this.next = next;
}
}
包含 Hashtable 本身的所有方法的类:
package Laboration2;
import javax.swing.*;
import java.util.Iterator;
import java.util.LinkedList;
/**
* Created by Victor on 22/09/16.
*/
public class Hashtable {
private LinkedList<Object> insertionOrder = new LinkedList<Object>();
private LinkedList<Entry>[] table;
// Constructor that initiates a hashtable
public Hashtable(int size) {
table = (LinkedList<Entry>[]) new LinkedList<?>[size];
for (int i = 0; i < size; i++) {
table[i] = new LinkedList<Entry>();
}
}
// Hashfunction
private int hashIndex(Object key) {
int hashCode = key.hashCode();
hashCode = hashCode % table.length;
return (hashCode < 0) ? -hashCode : hashCode;
}
public Object get(Object key) {
int hashIndex = hashIndex(key);
LinkedList<Entry> entries = table[hashIndex];
Iterator<Entry> it = entries.listIterator();
while (it.hasNext()) {
Entry entry = it.next();
if (entry.equals(key)) {
return entry.getValue();
}
}
return null;
}
public void put(Object key, Object value) {
int hashIndex = hashIndex(key);
LinkedList<Entry> entries = table[hashIndex];
Iterator<Entry> it = entries.listIterator();
while (it.hasNext()) {
Entry entry = it.next();
if (entry.equals(key)) {
entry.setValue(value);
insertionOrder.add(value);
} else {
entry.setNext(new Entry(key, value));
insertionOrder.add(value);
}
}
}
public static void main(String[] args) {
Hashtable table = new Hashtable(15);
table.put("hej", "hello");
table.put("nej", "no");
table.put("senare", "later");
table.put("idag", "today");
table.put("igår", "yesterday");
table.get("hej");
}
}
EDIT1(用于 Krishas 评论):
public void put(Object key, Object value) {
int hashIndex = hashIndex(key);
LinkedList<Entry> entries = table[hashIndex];
Iterator<Entry> it = entries.listIterator();
if (table[hashIndex] == null) {
table[hashIndex] = new LinkedList<Entry>(key, value);
} else {
while (it.hasNext()) {
Entry entry = it.next();
if (entry.equals(key)) {
entry.setValue(value);
insertionOrder.add(value);
} else {
entry.setNext(new Entry(key, value));
insertionOrder.add(value);
}
}
}
}
【问题讨论】:
-
您是否调试过您的代码,并发现它的行为与您的预期不符?
-
请注意,您的
Entry.equals方法很奇怪 - 您通常会将一个 Entry 与另一个而不是键进行比较。 (它是不对称的。)覆盖equals而不覆盖hashCode也是不寻常的。 -
您的
equals方法不是更容易写成return Objects.equal(obj, key);吗? (无需创建Entry) -
我认为您还需要覆盖 hashCode 方法。参考这个stackoverflow.com/questions/2265503/…。
-
Hascode函数和Equals方法都是我们老师提供给我们的,所以我不会不了解
标签: java data-structures hashtable