1

私はデッキと呼ばれるArrayListを作成するクラス「デッキ」を持っています。カードを逆の順序でトラバースするネストされた Iterator クラスを作成しようとしています。

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();
        }  
    }
}

以下の提案を試しましたが、まだ運がありません... 1 つの ArrayList を別の ArrayList に逆の順序でコピーする代わりに、アウター クラスの既存の ArrayList を反復処理したいと思います。これを行う最も効率的な方法は何ですか?

4

3 に答える 3

3

最初にDeck実装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

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 に答える
0

Iteratorinterfaceであるため、その中にメソッドを実装する必要があります。詳細については、この SO の質問を参照してください。

ただし、おそらく最も簡単なのは、その中にメソッドを作成するDeckことです

  1. コレクションのコピーを作成しますが、順序は逆です
  2. そのコレクションの反復子を返します

元のコレクションのコピーを反復処理しているため、デスクからカードを追加/削除する別のスレッドの影響を受けないことに注意してください。

于 2012-11-14T15:54:10.797 に答える