The student at the top of the stack is Gullion,Hailey
Student Mcglothlen,Shizue is removed from the stack
Here are all the elements of the Stack using an Iterator
--------------------------------------------------------
Stack$Node@3012db7c
Stack$Node@2607c28c
Stack$Node@477588d5
Stack$Node@756a7c99
Stack$Node@221a5d08
Stack$Node@70d1c9b5
Stack$Node@5d11c3f0
Stack$Node@3956f14c
Stack$Node@7afbd1fc
null
Here are all the elements in the Stack
--------------------------------------
Putney,John
Larkey,Ismael
Winkler,Isiah
Aceto,Liana
Hamill,Crissy
Caraway,Elmira
Gullion,Hailey
Rodrigez,Jonie
Madruga,Terrell
Williams,Diego
使用Iterator的Stack的第一个元素列表显然不起作用。我不知道为什么。这是我在Stack类中的Iterator代码:
public Iterator<Student> iterator() { return new ListIterator(); }
// an iterator, doesn't implement remove() since it's optional
private class ListIterator implements Iterator<Student> {
private Node<Student> current = top;
public boolean hasNext() {
return current != null;
}
public void remove() {
throw new UnsupportedOperationException();
@SuppressWarnings("unchecked")
public Student next() {
if (!hasNext()) throw new NoSuchElementException();
current = current.next;
return (Student)current;
}
}
以下是我的Driver类中似乎存在问题的代码:
System.out.println("\nHere are all the elements of the Stack using an Iterator");
System.out.println("--------------------------------------------------------");
Iterator <Student> iter = myStack.iterator();
while (iter.hasNext() )
System.out.println(iter.next() );
这里是所有课程:
堆叠:http://pastebin.com/2HVLVHuM
队列类:http://pastebin.com/3q537kHW
学生班:http://pastebin.com/UnBB7kPA
驱动程序类:http://pastebin.com/yeA34MNd
我只能在堆栈类中编写代码。这一点是使用队列实现堆栈。希望这有帮助
答案 0 :(得分:2)
您需要在toString()
课程中添加Student
方法。迭代器工作正常,但System.out.println()
不知道如何显示Student
。
像这样向Student
类添加内容......
public String toString(){
return name;
}
因此,当您致电System.out.println()
时,它可以输出实际值。当您致电System.out.println(Object)
时,它始终会尝试输出toString()
值。如果未定义此方法,它将输出对象的java ID,这就是您所看到的。
答案 1 :(得分:2)
首先,请参阅nneonneo对next()
方法中错误演员的回答。
其次,您的Iterator实现不正确。
迭代器中的next()
函数在将其设置为current
后返回元素current.next
。
在迭代的最后一个元素上调用next()
后,hasNext()
应该返回false。但它没有,因为current
仍指向刚刚返回的元素。因此,您将再次致电next()
。在此方法中,current = current.next
会将current
设置为null
,然后将其返回。哪个不应该发生,因为hasNext是真的,对吧?
出于同样的原因,您的堆栈的第一个元素丢失了:您将current
设置为堆栈的顶部元素,但在输出任何内容之前,您已经切换到current = current.next
。你应该在完成输出之后。
答案 2 :(得分:2)
current
迭代器中的 Stack
定义为Node<Student>
。您可以使用强制转换从current
方法返回next()
。
因此,next()
会返回Node<Student>
(类型转换为Student
),而不是实际的Student
。由于Node
可能没有toString
方法,因此您会获得默认输出(Stack$Node@<addr>
)。
要修复此问题,请从current.item
返回next()
之类的内容(假设Node
中存储的项目称为item
)。
答案 3 :(得分:1)
使用Iterator的Stack的第一个元素列表显然不起作用。我不知道为什么。
因为你的迭代器正在返回Node<Student>
而不是学生。问题出在:
return (Student)current;
你可能试过这样做,但得到了一个不兼容的类型错误:
return current;
所以你试图通过施法来修复。问题是节点不是学生。节点包含学生。您需要返回该节点包含的学生。
试试这个:
return current.data;
不需要强制转换,因为编译器知道节点的“data”成员是Student,因为您声明了类型为Node<Student>
的当前状态。这将解决学生打印错误的问题。但正如@Konstantin指出的那样,你的迭代器仍然被打破。您需要在临时变量中保存当前值,移动当前值,然后返回临时变量。这是一个可能的实现:
public Student next() {
if (current == null) throw new NoSuchElementException();
Node<Student> result = current;
current = current.next;
return result.data;
}
[结语
您确实需要查看generics tutorial。从上面粘贴的代码中不清楚,但在粘贴框代码中很明显,您使用Student作为类型参数。这是非常不标准和令人困惑的。惯例是使用大写字母 - 通常是T.你应该像下面那样声明堆栈。你使用学生的任何地方,用T替换它。
public class Stack <T> implements Iterable<T>{ // good
而不是
public class Stack <Student> implements Iterable<Student>{ // bad
T表示稍后要确定的某种类型,您可以将Stack与任何类型的对象一起使用。只有在您实际创建堆栈时才使用Student(或其他)
public static void main(String [] args)
{
Stack<Student> x = new Stack<Student>();