所以我正在开发一个涉及两种数据类型的程序:一个链表和一个Arraylist。
链接的List Iterator如下所示:
private class NodeIterator implements Iterator<StudentIF> {
private Node curr;
public NodeIterator(Node head) {
curr = head;
}
public void remove() { }
public boolean hasNext() {
if (curr == null)
return false;
return true;
}
public StudentIF next() {
Node temp = curr;
curr = curr.getNext();
return temp.getData();
}
} // end class NodeIterator
我调用了ArrayList Iterator方法/类。
MyArrayListName.iterator();
这是调用迭代器的方法:
public StudentIF getStudent(int id) {
Iterator<StudentIF> xy = iterator();
while (xy.hasNext()) {
if (id == xy.next().getId()) {
return xy.next();
}
}
// Student doesn't exist
return null;
}
我的问题是当我调用我的方法通过它们的id(实例变量)获取我的对象时,它总是抓取NEXT对象,而不是我想要的对象。如何使用链接列表和数组列表获取当前对象?
请帮帮我!
答案 0 :(得分:6)
您使用next()
方法两次,这可能就是原因。
试试这个
while (xy.hasNext()) {
StudentIF tmp = xy.next();
if (id == tmp.getId()) {
return tmp;
}
答案 1 :(得分:4)
问题是你在循环中调用.next()两次:
if (id == xy.next().getId())
{
return xy.next();
}
两次调用next()会使你的迭代器前进两次,这不是你想要的。您需要将下一个保存在临时变量中,如下所示:
StudentIF nextStudent = xy.next();
if (nextStudent.getId() == id)
{
return nextStudent;
}
答案 2 :(得分:3)
每次使用next()方法时,它都会递增迭代器,所以通过调用
if (id == xy.next().getId())
和
return xy.next();
你实际上正在递增迭代器。
您最好的选择是存储xy.next(),进行所需的任何比较,然后按如下方式返回:
public StudentIF getStudent(int id) {
Iterator<StudentIF> xy = iterator();
while (xy.hasNext()) {
StudentIF student = xy.next();
if (id == student.getId()) {
return student;
}
}
// Student doesn't exist
return null;
}
答案 3 :(得分:2)
您正在拨打.next()
两次。
解决方案应该只调用一次并将其保存在这样的变量中:
while (xy.hasNext()) {
StudentIF student = xy.next();
if (id == student.getId()) {
return student;
}
}