在Java中比较两个'card'对象[重复]

wvyml7n5  于 2023-05-15  发布在  Java
关注(0)|答案(3)|浏览(169)

此问题已在此处有答案

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,但它只是变得复杂和丑陋,无论如何都不起作用。有人有什么建议吗?

klsxnrf1

klsxnrf11#

另一种方法是使用Java8中引入的 Comparator 接口及其静态工厂方法:

private final Comparator<Card> comparator = Comparator.comparingInt((Card card) -> card.rank.ordinal())
        .thenComparing((Card card) -> card.suit.ordinal());

然后,您可以直接使用此比较器,或通过重写的compareTo方法使用:

@Override
public int compareTo(Card other) {
    return comparator.compare(this, other);
}

由于这个问题也被标记为oop,我将补充说,整个比较逻辑应该属于一个卡 * 游戏 *,而不是卡本身。
换句话说,如果这个比较是特定于游戏的,你应该避免把它放在你的实体/模型中。因此,您可以轻松地将Card对象重用于不同的卡games

c9qzyr3d

c9qzyr3d2#

可以使用Comparator.comparing
我知道rank的优先级高于suit,所以可以这样做:

import java.util.Comparator;

public class Cards {

  enum Suit {hearts, clubs, diamonds, spades}

  enum Rank {_2, _3, _4, _5, _6, _7, _8, _9, _10, joker, queen, king, ace,}

  record Card(Suit suit, Rank rank) implements Comparable<Card> {
    @Override
    public int compareTo(Card o) {
      return Comparator.comparing(Card::rank).thenComparing(Card::suit).compare(this, o);
    }
  }

  public static void main(String[] args) {
    var c1 = new Card(Suit.hearts, Rank.ace);
    var c2 = new Card(Suit.spades, Rank._2);
    System.out.println(c1.compareTo(c2));
  }
}
kmbjn2e3

kmbjn2e33#

您可以将进一步的比较添加到else中:

@Override
    public int compareTo(Card o) {
        
        if(this.rank.ordinal() > o.rank.ordinal()) {
            return 1;
        }
        else if (this.rank.ordinal() < o.rank.ordinal()) {
            return -1;
        } 
        else {
            if (this.suit.ordinal() > o.suit.ordinal()) {
                return 1;
            }
            else if (this.suit.ordinal() < o.suit.ordinal()) {
                return -1;
            }
        }

        return 0;
    }

相关问题