【问题标题】:Implementing custom Iterator on a LinkedList在 LinkedList 上实现自定义迭代器
【发布时间】:2015-05-26 03:07:07
【问题描述】:

我正在尝试在我创建的 LinkedList 类上创建自定义迭代器。我被要求更改 add 函数,以便它按从小到大的顺序添加对象 Term。 (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);
    }

}

【问题讨论】:

  • addTerm 已经有一个循环,它完全符合您的要求。我认为您的问题存在于迭代器实现中。
  • 您可能想要添加对代码预期操作的说明。另外:Iterator.next() 应该在结束时提高NoSuchElementException。你的实现得到一个通用的空指针。

标签: java linked-list iterator


【解决方案1】:

你不能轻易地使用你的迭代器,因为它通过值而不是节点:

@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;
    }

}

如果你想使用迭代器,那么你应该定义'Node'迭代器(并在你的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.
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-23
    • 2018-08-25
    • 2015-01-22
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多