我见过关于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
实现根本不起作用。救命啊!
答案 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
}