1

我有一个类'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。这样做最有效的方法是什么?

4

3 回答 3

3

首先 make Deckimplement Iterable<Card>,这将要求您实现该iterator()方法。使该方法返回嵌套DeckIterator类的实例。

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

然后DeckIterator实现Iterator<Card>并实现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
}
于 2012-11-14T15:52:31.247 回答
0

Iterator是一个接口,因此您需要实现其中的方法。有关更多信息,请参阅此 SO 问题

但是,也许最简单的方法是在您Deck

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

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

于 2012-11-14T15:54:10.797 回答
0

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

这应该很容易,不应该导致太多的变化/重构。

于 2012-11-14T16:00:08.490 回答