如何使用比较器方法排序枚举对象?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
相关产品推荐
相关产品推荐

