如何遍历具有特定变量的对象列表?

时间:2019-02-08 13:14:06

标签: java iterator

因此,我有一个Deck类,其中包含一个甲板列表,该甲板列表创建52个Card对象并将其存储在数组列表中。我可以使用显示的迭代器遍历该平台列表,但是现在我想知道如何修改迭代器以遍历某些变量的平台列表。例如,我只想遍历所有黑桃或所有国王。谢谢。

fyi:DeckIterator在Deck类中,我只是不知道如何格式化堆栈上的代码。抱歉。

    public class Card implements Serializable, Comparable<Card> {    
        static final long serialVersionUID = 100;

        Suit suit;
        Rank rank;

        public Card(Rank rank, Suit suit){
            this.rank = rank;
            this.suit = suit;
        }
    }

    public enum Rank {
        TWO(2), THREE(3), FOUR(4), FIVE(5), 
        SIX(6), SEVEN(7), EIGHT(8), NINE(9),
        TEN(10), JACK(10), QUEEN(10), KING(10), ACE(11);

        int value;

        public static Rank valuesList[] = Rank.values();

        Rank(int value){
            this.value = value;
        }

        public int getValue() {
            return this.value;
        }

        public Rank getNext() {
            if (this.value == 11) {
                return valuesList[0];
            } else {
                return valuesList[ordinal() + 1];
            }
        }

        public int getOrdinal() {
            return ordinal();
        } 
    }

    public enum Suit {
        CLUBS, DIAMONDS, HEARTS, SPADES;

        public static Suit suitsList[] = Suit.values();

        public Suit randomSuit() {
            Random random = new Random();
            return suitsList[random.nextInt(4)];
        }
    }

    private class DeckIterator<Card> implements Iterator<Card> {
        private final Deck deck;
        private int pos = 0;

        public DeckIterator(Deck deck) {
            this.deck = deck;
            pos = 0;
        }

        @Override 
        public boolean hasNext() {
            return pos < deck.size();
        }

        @Override 
        public Card next() {
            return (Card) deck.deck.get(pos++);
        }

        @Override
        public void remove() {
            deck.deck.remove(pos);
        }
    }

2 个答案:

答案 0 :(得分:4)

您不能;与此数据结构无关。您有几种选择:

  1. 反复进行所有操作,但是如果与您的所需状态不匹配,则在顶部终止此迭代。例如:

    for (Card card : deck) {
        if (card.getRank() != Rank.ACE) continue;
        /* code to deal with aces here */
    }
    
  2. 您使用流API构造进行过滤。您没有在粘贴中包含Deck类,但是假设deck.deck是某种java.util.List,则可以执行以下操作:

    deck.deck.stream().filter(x -> x.getRank() == Rank.ACE).iterator()
    

这将为您提供一个仅通过A进行迭代的迭代器。

答案 1 :(得分:2)

  

我只想遍历所有黑桃或所有国王。

我们在这里。

new DeckIterator(deck, card -> Rank.KING.equals(card.getRank()));
new DeckIterator(deck, card -> Suit.SPADES.equals(card.getSuit()));

我完全同意@rzwitserloot的回答,并将使用我的迭代器扩展他的帖子,该迭代器使用Predicate构成另一个仅覆盖选定元素的迭代器。

class DeckIterator implements Iterator<Card> {

    private final Iterator<? extends Card> iterator;

    public DeckIterator(Deck deck, Predicate<Card> predicate) {
        iterator = deck.deck.stream().filter(predicate).iterator();
    }

    @Override
    public boolean hasNext() {
        return iterator.hasNext();
    }

    @Override
    public Card next() {
        return iterator.next();
    }

    @Override
    public void remove() {
        iterator.remove();
    }

}