【问题标题】:Nested Iterator Class嵌套迭代器类
【发布时间】:2012-11-14 15:50:34
【问题描述】:

我有一个类'Deck',它创建一个名为deck 的ArrayList。 我正在尝试创建一个嵌套迭代器类,它以相反的顺序遍历卡片。

public class Deck {

    //Nested Iterator class to traverse the Cards in reverse order
    public abstract class DeckIterator implements Iterator<Card>{

        ListIterator it = deck.listIterator(deck.size());

        //Iterate in reverse.
        while(it.hasPrevious()) { //errors
            //System.out.println(it.previous());
            return it.previous();
        }  
    }
}

我已经尝试了以下建议,但我仍然没有运气... 而不是以相反的顺序将一个 ArrayList 复制到另一个,我宁愿迭代外部类中的现有 ArrayList。最有效的方法是什么?

【问题讨论】:

  • 这有很多问题!
  • 如果你真的想写一个“迭代器”,你只需实现接口。但为什么呢?
  • 试试DeckIterator implements Iterator&lt;Card&gt;
  • 我没有看到任何证据表明您自己尝试过解决方案。

标签: java iterator


【解决方案1】:

首先让Deck实现Iterable&lt;Card&gt;,这需要你实现iterator()方法。使该方法返回嵌套的 DeckIterator 类的实例。

@Override
public Iterator<Card> iterator()
{
    return new DeckIterator(deck);
}

然后让DeckIterator实现Iterator&lt;Card&gt;并实现hasNext()next()remove()方法。

private static class DeckIterator implements Iterator<Card>
{

private int nextCard;
private final List<Card> cards;

public DeckIterator(List<Card> cards)
{
    this.cards = cards;
    this.nextCard = cards.size() - 1;
}

@Override
public boolean hasNext()
{
    if (nextCard < 0)
        return false;
    return true;
}

/**
 * {@inheritDoc}
 */
@Override
public Card next()
{
    if (hasNext())
        return cards.get(nextCard--);
    return null;
}

/**
 * {@inheritDoc}
 */
@Override
public void remove()
{

}
}

然后使用,

Iterator<Card> iterator = yourDeck.iterator();
while (iterator.hasNext())
{
 Card card = iterator.next();
}

在甲板上向后迭代。

但是,如果您只想反向迭代,则不需要创建自己的 Iterator ListIterator 可以为您完成。

ArrayList<Card> deck = new ArrayList<Card>();
// Do whatever you do with your deck :P

ListIterator<Card> li = deck.listIterator(deck.size());

// Iterate in reverse.
while(li.hasPrevious()) 
{
  Card card = li.previous();
  // Do stuff with the card
}

【讨论】:

  • 这就是我的目标,除了“类型的非法开始,包 li 不存在,需要 ,';'预期的,缺少返回语句
  • 更新了我的答案,现在迭代器应该反向迭代
【解决方案2】:

使用 Guava,您可以反转列表并迭代结果。 看着: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Lists.html#reverse%28java.util.List%29

这应该很容易,不会导致太多的更改/重构。

【讨论】:

    【解决方案3】:

    Iterator 是一个接口,因此您需要实现其中的方法。请参阅this SO question 了解更多信息。

    但是,也许最简单的方法是在您的 Deck 中创建一个方法

    1. 创建集合的副本,但顺序相反
    2. 返回那个集合的迭代器

    请注意,由于您现在正在对原始集合的副本进行迭代,因此它应该不受另一个线程在桌面上添加/删除卡片的影响。

    【讨论】:

    • 可能想要添加解决方案的文本。有很多帖子因“仅链接”答案而被标记/删除
    猜你喜欢
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多