Java LinkedStack 实现中 ToString 方法的问题
Issues with ToString method in Java LinkedStack implementation
我对这项作业有一个小问题:
我想完成 LinkedStack 实现并确保 peek、isEmpty 和 size 方法按照 Stack 接口中的定义实现。
我相信我的大部分工作正常(虽然还没有测试过)但是我在 ToString 方法中遇到了一个障碍
这是导师提供的启动
public interface Stack<T> {
/**
* Adds the specified element to the top of this stack.
* @param element element to be pushed onto the stack
*/
public void push(T element);
/**
* Removes and returns the top element from this stack.
* @return the element removed from the stack
*/
public T pop();
/**
* Returns without removing the top element of this stack.
* @return the element on top of the stack
*/
public T peek();
/**
* Returns true if this stack contains no elements.
* @return true if the stack is empty
*/
public boolean isEmpty();
/**
* Returns the number of elements in this stack.
* @return the number of elements in the stack
*/
public int size();
/**
* Returns a string representation of this stack.
* @return a string representation of the stack
*/
public String toString();}
这是我的 LinkedStack 代码 class:
public class LinkedStack<T> implements Stack<T> {
private Node head; //the head node
private int size; // number of items
private class Node {
T item;
Node next;
}
public LinkedStack() {
head = null;
size = 0;
}
public boolean isEmpty() { return (size == 0); }
public T pop() {
T element = head.item;
head = head.next;
size--;
return element;
}
public void push(T element) {
Node oldHead = head;
head = new Node();
head.item = element;
head.next = oldHead;
size++;
}
public int size() { return size; }
public T peek() {
if (isEmpty()) throw new NoSuchElementException("Error: Stack underflow");
return head.item;
}
public String toString() {
StringBuilder string = new StringBuilder();
for (T stack : this) {
string.append(stack + " ");
}
return string.toString();
}}
由此我得到了错误
for-each 不适用于表达式类型
必需:数组或 java.lang.Iterable
发现:edu.csuniv.isiahjohnson.LinkedStack
我是否需要堆栈项的 Iterator 对象,或者这是否仅适用于 LinkedList class?
这是一种解决方案。它没有实现 Iterable
,但它只是迭代节点。我还删除了最后一个 space。您可以使用 StringJoiner
而不是 StringBuilder
,它自 Java 8.
以来就存在
@Override
public String toString() {
final StringBuilder string = new StringBuilder();
Node node = this.head;
while (node != null) {
string.append(node.item).append(' ');
node = node.next;
}
// remove last space:
if (string.length() > 0)
string.setLength(string.length() - 1);
return string.toString();
}
如果您想在 java 中使用每个循环,您的对象需要实现 Iterable
接口。
在java中,这段代码:
for (T stack : this) {
...
}
是语法糖:
for(Iterator<T> iter = this.iterator(); iter.hasNext(); ) {
T item = iter.next();
...
}
很明显你需要 iterator()
来做到这一点,因此 - 实施 Iterable
我对这项作业有一个小问题: 我想完成 LinkedStack 实现并确保 peek、isEmpty 和 size 方法按照 Stack 接口中的定义实现。 我相信我的大部分工作正常(虽然还没有测试过)但是我在 ToString 方法中遇到了一个障碍
这是导师提供的启动
public interface Stack<T> {
/**
* Adds the specified element to the top of this stack.
* @param element element to be pushed onto the stack
*/
public void push(T element);
/**
* Removes and returns the top element from this stack.
* @return the element removed from the stack
*/
public T pop();
/**
* Returns without removing the top element of this stack.
* @return the element on top of the stack
*/
public T peek();
/**
* Returns true if this stack contains no elements.
* @return true if the stack is empty
*/
public boolean isEmpty();
/**
* Returns the number of elements in this stack.
* @return the number of elements in the stack
*/
public int size();
/**
* Returns a string representation of this stack.
* @return a string representation of the stack
*/
public String toString();}
这是我的 LinkedStack 代码 class:
public class LinkedStack<T> implements Stack<T> {
private Node head; //the head node
private int size; // number of items
private class Node {
T item;
Node next;
}
public LinkedStack() {
head = null;
size = 0;
}
public boolean isEmpty() { return (size == 0); }
public T pop() {
T element = head.item;
head = head.next;
size--;
return element;
}
public void push(T element) {
Node oldHead = head;
head = new Node();
head.item = element;
head.next = oldHead;
size++;
}
public int size() { return size; }
public T peek() {
if (isEmpty()) throw new NoSuchElementException("Error: Stack underflow");
return head.item;
}
public String toString() {
StringBuilder string = new StringBuilder();
for (T stack : this) {
string.append(stack + " ");
}
return string.toString();
}}
由此我得到了错误 for-each 不适用于表达式类型 必需:数组或 java.lang.Iterable 发现:edu.csuniv.isiahjohnson.LinkedStack
我是否需要堆栈项的 Iterator 对象,或者这是否仅适用于 LinkedList class?
这是一种解决方案。它没有实现 Iterable
,但它只是迭代节点。我还删除了最后一个 space。您可以使用 StringJoiner
而不是 StringBuilder
,它自 Java 8.
@Override
public String toString() {
final StringBuilder string = new StringBuilder();
Node node = this.head;
while (node != null) {
string.append(node.item).append(' ');
node = node.next;
}
// remove last space:
if (string.length() > 0)
string.setLength(string.length() - 1);
return string.toString();
}
如果您想在 java 中使用每个循环,您的对象需要实现 Iterable
接口。
在java中,这段代码:
for (T stack : this) {
...
}
是语法糖:
for(Iterator<T> iter = this.iterator(); iter.hasNext(); ) {
T item = iter.next();
...
}
很明显你需要 iterator()
来做到这一点,因此 - 实施 Iterable