如何通过对象的具有特定变量列表循环?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过对象的具有特定变量列表循环?相关的知识,希望对你有一定的参考价值。

所以,我必须保持它创建52个对象并将其存储在一个数组列表甲板列表甲板类。我可以用我已经证明了迭代器通过甲板列表循环,但现在我想知道我怎么能修改通过迭代器的某些变量甲板列表进行迭代。举例来说,我只是想通过所有的黑桃或全部国王进行迭代。谢谢。

FYI:该DeckIterator是甲板类中我只是不知道如何格式化在堆栈中的代码。道歉。

    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);
        
    
答案

你不能;不具有该数据结构。您有几种选择:

  1. 通过迭代的一切,但在顶级中止本次迭代,如果它不符合您需要的状态。例如: for (Card card : deck) if (card.getRank() != Rank.ACE) continue; /* code to deal with aces here */
  2. 您可以使用流API构建过滤。你不包括你的卡类的粘贴,但假设deck.deck是某种java.util.List的,比如,你可以这样做: deck.deck.stream().filter(x -> x.getRank() == Rank.ACE).iterator()

这将给你一个迭代器遍历只有尖子。

另一答案

我只是想通过所有的黑桃或全部国王进行迭代。

我们来了。

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


以上是关于如何通过对象的具有特定变量列表循环?的主要内容,如果未能解决你的问题,请参考以下文章

如何在一组对象中查找特定值?

如何从对象数组中获取具有属性的列表,除非它包含具有特定值的另一个项目?

如何根据对象属性字符串过滤“ngFor”循环内的项目

如何通过Powershell代码更改特定WPF列表框项的背景颜色?

按特定参数对对象列表进行排序

shell脚本--------for循环