此问题已在此处有答案:
How to compare objects by multiple fields(23答案)
2天前关闭。
我在这个问题上卡住了,我需要比较两张牌的对象,根据它们的等级和花色。红桃是最小的花色,黑桃是最大的。而对于等级,一是最低的,王牌是最高的。黑桃5是红心2。这些值存储在各自类型的两个枚举中。红桃是第一个序数,黑桃是最后一个序数。
@Override
public int compareTo(Card o) {
if(this.rank.ordinal() > o.rank.ordinal()) {
return 1;
}
if (this.rank.ordinal() < o.rank.ordinal()) {
return -1;
}
else {
return 0;
}
在我的comapreTo()中,我已经实现了排名的比较,但我仍然坚持比较花色以找到更大的牌。一旦它经过红心A,这个代码就会失败,因为它认为梅花1更高。我已经尝试了很多不同的方法使用if,但它只是变得复杂和丑陋,无论如何都不起作用。有人有什么建议吗?
3条答案
按热度按时间klsxnrf11#
另一种方法是使用Java8中引入的 Comparator 接口及其静态工厂方法:
然后,您可以直接使用此比较器,或通过重写的
compareTo
方法使用:由于这个问题也被标记为
oop
,我将补充说,整个比较逻辑应该属于一个卡 * 游戏 *,而不是卡本身。换句话说,如果这个比较是特定于游戏的,你应该避免把它放在你的实体/模型中。因此,您可以轻松地将
Card
对象重用于不同的卡games
。c9qzyr3d2#
可以使用Comparator.comparing:
我知道
rank
的优先级高于suit
,所以可以这样做:kmbjn2e33#
您可以将进一步的比较添加到else中: