我正在为纸牌游戏编写Hand
类,并且我希望能够跟踪Suit
中每个Hand
的纸牌数量。我正在将ArrayList
类型的Card
存储在Hand
中,作为我的手。因此,这就是我目前跟踪Suit
中每个Hand
的数量的方式:
public class Hand {
private ArrayList<Card> hand;
private int clubs, diamonds, hearts, spades;
public Hand() {
hand = new ArrayList<Card>();
clubs = 0;
diamonds = 0;
hearts = 0;
spades = 0;
}
public Hand(Hand otherHand) {
this.hand.addAll(otherHand.hand);
CountSuits(otherHand.hand);
}
public Hand(ArrayList<Card> hand) {
clubs = 0;
diamonds = 0;
hearts = 0;
spades = 0;
this.hand = hand;
CountSuits(hand);
}
public void CountSuits(ArrayList<Card> cards) {
clubs += Collections.frequency(cards, Card.suit.CLUBS);
diamonds += Collections.frequency(cards, Card.suit.DIAMONDS);
hearts += Collections.frequency(cards, Card.suit.HEARTS);
spades += Collections.frequency(cards, Card.suit.SPADES);
}
}
这是一种混乱/错误的方式吗?测试时它给出的输出奇数,这让我觉得它不是水密的,并且可能有更好的方法。这是我的Card
类:
public class Card {
public enum rank {ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING};
private rank Rank;
public enum suit {CLUBS, DIAMONDS, HEARTS, SPADES};
private suit Suit;
public Card() {
Rank = null;
Suit = null;
}
public Card(rank Rank, suit Suit) {
this.Rank = Rank;
this.Suit = Suit;
}
}
答案 0 :(得分:1)
1)我本应该使用HashMap<Card.suit, ArrayList<Card>> hand;
并按西装组织卡片,而不是使用整个包围阵列。这将涉及遍历构造函数中的整个Hand,并将每张卡放置在其合法的ArrayList中。
然后将获得西装的大小,如下所示:
diamonds = hand.get(Card.suit.DIAMONS).size()
hearts = hand.get(Card.suit.HEARTS).size()
spades = hand.get(Card.suit.SPADES).size()
clubs = hand.get(Card.suit.CLUBS).size()
2)我尚未对此进行测试,但我认为Collections.frequency()
在这里无法使用。它将提供的集合(Card类型的对象)中的每个条目与card.suit类型进行比较。您实际上是在比较不同类型的对象。频率中使用的equals()的结果将全部为false
。
3)另外,上述代码的一些注意事项:
private
。 (例如CountSuits)super()
相互调用是一种很好的OOP做法答案 1 :(得分:0)
如果您不需要将卡片存储为地图,则可以使用它为您提供西服数量的地图。
Map<Card.suit, Long> map3 = things.stream().collect(Collectors.groupingBy(Card::getSuit, Collectors.counting()));