如何将其他属性的“ tally”保留为自己的类属性

时间:2019-01-30 16:59:10

标签: java

我正在为纸牌游戏编写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;
    }
}

2 个答案:

答案 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)另外,上述代码的一些注意事项:

  • 方法通常以小写开头(例如CountSuits)
  • 使您不想公开的方法private。 (例如CountSuits)
  • 让构造函数使用super()相互调用是一种很好的OOP做法

答案 1 :(得分:0)

如果您不需要将卡片存储为地图,则可以使用它为您提供西服数量的地图。

Map<Card.suit, Long> map3 = things.stream().collect(Collectors.groupingBy(Card::getSuit, Collectors.counting()));