如何解决为带有节点的Java哈希表编写自己的迭代器
对于我们的Java类,我们希望在SymbolTable类中实现自己的迭代器(本质上只是一个哈希表)。我已经完成了SymbolTable类,但没有完成迭代器类。我不确定如何构建构造函数,以及如何正确填写hasNext();。方法。 供参考,这是内部节点类:
private class Node {
// nodes used to build the linked lists used in a
// separate chaining hash table
private String key;
private Object data;
private Node next;
private Node(String k,Object d,Node n) {
key = k;
data = d;
next = n;
}
}
private Node table[];
private int tableSize;
//Used in iterator
现在,这是我到目前为止对迭代器的了解:
public class STIterator implements Iterator<String> {
// An iterator that iterates through the keys in the table
// each call to next returns the next key in the table
Node head;
Node current;
int pos = 0;
public STIterator() {
current = table[0];
}
public boolean hasNext() {
return current != null;
}
public String next() {
// have to move down to location i+1 usually
// move to next element in table thats not null
// PRE: hasNext()
if (hasNext()) {
String data = (String) current.data;
current = current.next;
return data;
}
return null;
}
}
因此,从本质上讲,此迭代器将扫描包含某些单词(从书本中扫描)的哈希表。因此,我们希望迭代器遍历表,直到找到不为空的数据(对象d)为止。表示哈希表中包含单词(由节点类中的键给定)的特定“插槽” /
解决方法
我想目前您的代码如下:
public class SymbolTable {
...
private class Node {
...
}
public class STIterator implements Iterator<String> {
...
}
}
让我们在main
中添加一个SymbolTable
方法:
public static void main(String... args) {
SymbolTable map = new SymbolTable();
map.put("foo","foo data");
map.put("bar","bar data");
Iterator<String> i = map.iterator();
while (i.hasNext()) {
System.out.println(i.next());
}
}
现在您有了一些可运行的代码,您可以提出有关它的问题。请尝试使用新代码以及程序具有的任何编译错误,异常或不良行为来编辑您的问题。
,这是一个真正棘手的问题,我不知道有什么比给您答案更好的真正答案了。我假设您不需要支持remove()
;如果您愿意,我会把那部分留作练习。
// FYI: this class doesn't have to be,and arguably shouldn't be,public
public class STIterator implements Iterator<String> {
// An iterator that iterates through the keys in the table
// each call to next returns the next key in the table
Node current = null;
int pos = 0;
public STIterator() {}
public boolean hasNext() {
while (current == null && pos < table.length) {
current = table[pos++];
}
return current != null;
}
public String next() {
if (!hasNext()) throw new NoSuchElementException();
String k = current.key;
current = current.next;
return k;
}
}
这是基于您要遍历整个表的假设。如果您要查找特定的密钥,则可能根本不应该使用迭代器,而应该只是循环。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。