[英]Implementing custom Iterator on a LinkedList
我試圖在我創建的LinkedList類上創建自定義迭代器。 我被要求更改add函數,以便它按從最小到最大的順序添加對象Term。 (術語是采用Term(int power)形式的簡單類)
我無法弄清楚如何在addTerm()中創建循環以繼續搜索下一個元素以查看其是否大於Term中的當前冪。 有人可以幫忙嗎?
import java.util.Iterator;
public class customImpl implements custom{
private static class Node {
Term data;
Node next;
}
private Node head;
private class TermIterator implements Iterator<Term> {
private Node current;
private TermIterator(Node start) {
current = start;
}
@Override
public boolean hasNext() {
return current != null;
}
@Override
public Term next() {
Term result = current.data;
current = current.next;
return result;
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not supported");
}
}
/**
* Add a term to the expression
*
* @param term the term to be added.
*/
@Override
public void addTerm(Term term) {
TermIterator iterator = new TermIterator(head);
Node newNode = new Node();
while(iterator.hasNext()) {
if(term.getPower() > iterator.next().getPower()) {
newNode.next = head;
}
else newNode.data = term;
}
newNode.data = term;
newNode.next = head;
head = newNode;
}
/**
* Returns an iterator over elements of type {@code T}.
*
* @return an Iterator.
*/
@Override
public Iterator<Term> iterator() {
return new TermIterator(head);
}
}
當迭代器遍歷值而不是節點時,您將無法輕松使用它:
@Override
public void addTerm(Term term) {
Node newNode = new Node();
newNode.term = term;
Node smaller = null; //smaller holds last element smaller than new term
Node current = head;
while(current != null) {
if(term.getPower() > current.term.getPower()) {
smaller = current;
break;
}
current = current.next;
}
if (smaller == null) {
newNode.next = head;
head = newNode;
} else {
newNode.next = smaller.next;
smaller.next = newNode;
}
}
如果要使用迭代器,則應定義“節點”迭代器(並在addTerm方法中使用它),然后重新使用它來定義“ Term”迭代器:
class NodeIterator implements Iterator<Node> {
Node next;
NodeIterator() {
next = head;
}
@Override
public boolean hasNext() {
return (next != null);
}
@Override
public Node next() {
if (next == null) throw new NoSuchElementException();
Node res = next;
next = next.next;
return res;
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not supported yet.");
}
}
class TermIterator implements Iterator<Term> {
final NodeIterator iter = new NodeIterator();
@Override
public boolean hasNext() {
return iter.hasNext();
}
@Override
public Term next() {
return iter.next().term;
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.