【问题标题】:How to have List Iterator start at a given index?如何让列表迭代器从给定的索引开始?
【发布时间】:2015-05-10 00:35:23
【问题描述】:

我有一个链表,我需要创建一个在列表中给定点返回迭代器的方法。我目前有一个从头部开始的迭代器:

public Iterator<E> iterator( )
{
    return new ListIterator();
}

我对另一个的只有:

public Iterator<E> iterator(int x )
{
    return new ListIterator();
}

我不确定如何利用给定的 position(x) 不会影响从头开始的 ListIterator 构造函数。

我尝试使用 for 循环到达“x”,但意识到这不会告诉迭代器从那里开始,所以我很困惑。

编辑:

public ListIterator()
        {
            current = head; // head in the enclosing list
        }

【问题讨论】:

    标签: java linked-list


    【解决方案1】:

    没有看到你的实现,简单的方法是:

    public Iterator<E> iterator(int x) {
        if (x < 0 || this.size() < x) {
            throw new IndexOutOfBoundsException();
        }
    
        Iterator<E> it = new ListIterator();
    
        for (; x > 0; --x) {
            it.next(); // ignore the first x values
        }
        return it;
    }
    

    否则,您可以将列表遍历到第 x 个节点,但没有理由不能这样做。

    【讨论】:

    • 这并不理想,来自 API:ListIterator&lt;E&gt; listIterator(int index) Returns a list iterator over the elements in this list (in proper sequence), starting at the specified position in the list. - 编辑:如果你生气了,我还在打字。
    • 是的,但为什么要重新发明轮子?
    • 我必须为一堂课写它,否则我会使用已经存在的那个。
    • 顺便说一句,这段代码是不是有问题? --x 将在评估线之前减少 x。因此,如果x == 1 不会执行循环,则会导致迭代器从位置 0 开始...
    • 感谢大家的帮助。这种方法确实有效,并且可能是我在没有新构造函数的情况下最简单的方法,否则 ListIterator(x) 会起作用。
    【解决方案2】:

    只需使用来自ListlistIterator(index); 方法,其中index 是一个类似于起始索引的int。编辑:在你的情况下,它会是

    List<...> list = ...;
    return list.listIterator(x);
    

    【讨论】:

    • 我之前尝试过,但是我的 ListIterator 构造函数没有接受任何内容,所以这给了我一个错误。我会在原文中补充。因此,为了分配,我不能添加新的构造函数,只能添加方法。
    【解决方案3】:

    所以我最终选择了这个。

    public Iterator<E> iterator(int x){
    
        Iterator<E> it = new ListIterator();
    
        for (; x > 0; --x){
            it.next(); 
        }
        return it;
    }
    

    考虑到更大的范围,我可能会添加一个构造函数,但无法进行太多更改,这效果最好。

    【讨论】:

    • 很高兴您提供了一个解决方案,但不要忘记接受 Radiodef 的答案并投票!
    • 这不完全是答案;您已从此处的一种解决方案中复制了代码。我很高兴看到它对你有用,但在这种情况下,适当的做法是接受和/或赞成最适合你的答案。
    猜你喜欢
    • 2014-01-15
    • 2019-05-25
    • 2017-11-13
    • 1970-01-01
    • 2020-01-15
    • 2011-09-03
    • 2021-02-23
    • 2023-01-23
    • 1970-01-01
    相关资源
    最近更新 更多