因此,我有一个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);
}
}
答案 0 :(得分:4)
您不能;与此数据结构无关。您有几种选择:
反复进行所有操作,但是如果与您的所需状态不匹配,则在顶部终止此迭代。例如:
for (Card card : deck) {
if (card.getRank() != Rank.ACE) continue;
/* code to deal with aces here */
}
您使用流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();
}
}