You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用比较器方法排序枚举对象?Java卡牌排序逻辑修复

解决Card类compareTo方法排序失效的问题

我仔细看了你的代码,问题核心出在compareTo方法的实现上——你现在的逻辑完全偏离了需求,一直在拿当前卡牌的rank.TWO和另一张卡牌的rank.THREE做比较,这根本不是在比较两张卡牌自身的等级和花色啊!

问题拆解与修正步骤

1. 修正Comparable泛型声明

你当前的Card类实现的是Comparable<Object>,这会导致你必须在方法里强制转换参数类型,既不安全也没必要。应该改成Comparable<Card>,这样方法参数直接就是Card类型:

public class Card implements Comparable<Card> {
    // 其余代码不变...

2. 正确实现compareTo逻辑

按照你的需求:先按Rank升序(TWO到ACE),Rank相同则按Suit升序(DIAMOND→CLUB→HEART→SPADE)。Java枚举类型本身自带自然顺序(就是你定义枚举常量的顺序),所以直接用枚举的compareTo方法就能搞定:

@Override
public int compareTo(Card other) {
    // 先比较Rank,返回非0值说明等级不同,直接返回结果
    int rankCompare = this.rank.compareTo(other.rank);
    if (rankCompare != 0) {
        return rankCompare;
    }
    // Rank相等时,再比较Suit
    return this.suit.compareTo(other.suit);
}

3. 补充equals和hashCode方法(可选但重要)

你的Hand类里用linearSearchList方法调用equals来判断卡牌是否重复,但默认的Object.equals是比较对象引用,不是卡牌的实际属性。所以最好重写这两个方法,确保同花色同等级的卡牌被判定为相等:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Card card = (Card) o;
    return suit == card.suit && rank == card.rank;
}

@Override
public int hashCode() {
    return Objects.hash(suit, rank);
}

修正后的完整Card类代码

import java.util.Objects;

public class Card implements Comparable<Card> {
    private Suit suit;
    private Rank rank;

    public Card(Suit suit, Rank rank) {
        this.suit = suit;
        this.rank = rank;
    }

    public Suit getSuit() {
        return suit;
    }

    public void setSuit(Suit suit) {
        this.suit = suit;
    }

    public Rank getRank() {
        return rank;
    }

    public void setRank(Rank rank) {
        this.rank = rank;
    }

    @Override
    public String toString() {
        return getSuit() + " " + getRank();
    }

    @Override
    public int compareTo(Card other) {
        int rankCompare = this.rank.compareTo(other.rank);
        if (rankCompare != 0) {
            return rankCompare;
        }
        return this.suit.compareTo(other.suit);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Card card = (Card) o;
        return suit == card.suit && rank == card.rank;
    }

    @Override
    public int hashCode() {
        return Objects.hash(suit, rank);
    }
}

测试验证

运行你的MainApp代码,排序后的输出会符合预期:

CLUB TWO
HEART EIGHT
DIAMOND QUEEN
DIAMOND KING
SPADE ACE

如果用你例子里的手牌(SPADE TWO、DIAMOND TWO、HEART ACE、CLUB NINE),排序后会输出:

DIAMOND TWO
SPADE TWO
CLUB NINE
HEART ACE

内容的提问来源于stack exchange,提问作者user3740970

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:08:04