如何计算列表中自定义数据类型的值?

时间:2017-03-24 21:41:07

标签: java list collections frequency

我见过关于hashMaps的一些内容,但我们的工作还没有那么深入。请尽可能简单地保留您的答案和有用的建议。

我有一个已经制作的自定义数据类型,完美地称为Color。该类型的唯一值是Color.BLUE,Color.RED,Color.YELLOW和Color.GREEN。

如果列表中的Color.BLUE多于其他颜色,我的任务是返回Color.BLUE,如果列表中的Color.RED多于其他颜色,则返回Color.RED,Color.GREEN相同和Color.YELLOW。

我已经研究过并且想出了这段代码:

public Color callColor(List<Card> hand) {

    int blueCards = Collections.frequency(hand, Color.BLUE);
    int redCards = Collections.frequency(hand, Color.RED);
    int greenCards = Collections.frequency(hand, Color.GREEN);
    int yellowCards = Collections.frequency(hand, Color.YELLOW);
    Color changeColorTo = Color.NONE;

    if ((blueCards > redCards) || (blueCards > greenCards) || (blueCards > yellowCards)) {
        changeColorTo = Color.BLUE;
    }

    if ((redCards > blueCards) || (redCards > greenCards) || (redCards > yellowCards)) {
        changeColorTo = Color.RED;
    }

    if ((greenCards > redCards) || (greenCards > blueCards) || (greenCards > yellowCards)) {
        changeColorTo = Color.GREEN;
    }

    if ((yellowCards > redCards) || (yellowCards > greenCards) || (yellowCards > blueCards)) {
        changeColorTo = Color.YELLOW;
    }
    return changeColorTo;
}

但是这个代码会导致blueCards,redCards,greenCards和yellowCards都为0,因为它们绝对不能为零。

因此,在这种情况下,我的Collections实现根本不起作用。救命啊!

3 个答案:

答案 0 :(得分:2)

您正在将List<Card>传递给该方法,但之后您正在搜索该列表中某个Color的频率。这就是为什么所有计数都等于0的原因。

答案 1 :(得分:1)

您的输入列表包含卡片而不是颜色。

所以可能解决的问题是首先将卡片列表转换为颜色列表:

hand.stream().map(Card::getColor).collect(Collectors.toList());

结果您将获得颜色列表,因此您现在可以使用Collection.frequency而不是初始卡列表。

然而,还有很多其他方法可以解决您的问题,例如使用另一个Collection。

答案 2 :(得分:0)

Collections#frequency查找给定集合中传递对象的出现,但在您的情况下,您希望匹配卡集合的属性。这就是为什么它为每个频率计算提供0

以下是找出每种颜色的卡数的迭代方法

for(Card card:hand) {

  if(card color is equal to Color.Blue) blueCards++
  else if(card color is equal to Color.Red) redCards ++

  // same code for other colors
}