如何检查列表中某个数据类型的数量?

时间:2017-03-24 16:58:34

标签: java binary uno operands

我正在编写一个主要方法的UnoPlayer.java代码,该方法已经写出来测试我们的UnoPlayer方法的合法性。

我正在检查手中的一种颜色(数据类型)的数量是否大于其他颜色的数量。

手是列表类型!!

所以,对于Color.BLUE,我有这个:

if (hand.contains(Color.BLUE > Color.RED && Color.GREEN && Color.YELLOW)) {
    colorReturned = Color.BLUE;
}

我知道这不起作用,因为我的Color数据类型不适用于二进制操作数,因为它们不是整数。我将如何编写代码以便

// if(hand包含比其余颜色更多的Color.BLUE){

//返回Color.BLUE}

这是卡片实施:

private UnoPlayer.Color color;
private UnoPlayer.Rank rank;
private int number;

public Card(UnoPlayer.Color color, UnoPlayer.Rank rank) {
    this.color = color;
    this.rank = rank;
    this.number = -1;
}


public Card(UnoPlayer.Color color, int number) {
    this.color = color;
    this.rank = UnoPlayer.Rank.NUMBER;
    this.number = number;
}


public Card(UnoPlayer.Color color, UnoPlayer.Rank rank, int number) {
    this.color = color;
    this.rank = rank;
    this.number = number;
}

2 个答案:

答案 0 :(得分:0)

假设hand是一张牌列表,其中每张牌都有一种颜色(如Uno游戏中),你可能想要写一个循环,跟踪每种颜色的次数。然后返回最大计数的那个。

List<Card> hand;
Map<Color, Integer> colorCount = new HashMap<>();
for (Card card : hand) {
   int currentCount = colorCount.get(card.getColor()) == null ? 0 : colorCount.get(card.getColor());
   colorCount.put(card.getColor(), currentCount + 1);
}

在Java 8中:

List<Card> hand;
Map<Color, Integer> colorCount = new HashMap<>();
list.forEach(card -> colorCount.put(card.getColor(), 1 + colorCount.getOrDefault(card.getColor(), 0)));

并查看此SO answer以获取地图上最大数量的颜色。

答案 1 :(得分:0)

问题是你没有正确使用contains,根据Java docs,方法contains会返回一个布尔变量(truefalse取决于列表中是否存在值)。但是,当containsObject作为参数时,您输入的是布尔表达式。

我建议检查某个数据类型是否出现在列表中最多,我首先对列表进行排序,然后保持最高发生数据类型的计数,如下所示,

Collections.sort(hand);
int prev = hand.get(0);
int occursMost = hand.get(0);
int count = 1;
int maxCount = 1;

for (int i = 1; i < hand.length; i++) {
    if (a.get(i) == prev)
        count++;
    else {
        if (count > maxCount) {
            popular = a.get(i-1);
            maxCount = count;
        }
        prev = hand.get(i);
        count = 1;
    }
}
if(occursMost == Color.BLUE) {
    colorReturned = Color.BLUE;
}

一点点如何运作,所以让我们说你的手看起来像这样

GREEN, BLUE, RED, GREEN, BLUE, BLUE

我不太确定颜色背后的int值,但在排序后,手可能看起来像这样,

GREEN, GREEN, RED, BLUE, BLUE, BLUE

循环将从绿色开始,然后继续递增count,直到找到不同的颜色。找到不同的颜色后,会使用count检查maxCount,看看到目前为止是否找到了最流行的颜色。然后它重置count并开始计算列表中下一个颜色的出现次数。在循环结束时,应设置列表中最常用的颜色。