Java中Card对象比较问题:已实现rank比较,需补充suit比较逻辑
解决Card对象compareTo方法的花色比较问题
你的问题出在牌面(Rank)相同时没有继续比较花色(Suit),直接返回了0,导致逻辑错误。根据你设定的规则,花色的ordinal值已经对应了等级(红桃最小,黑桃最大),所以只需要在牌面相等时,继续比较花色的ordinal即可。
修改后的简洁版代码
@Override public int compareTo(Card o) { // 先比较牌面,用Integer.compare简化判断逻辑 int rankCompare = Integer.compare(this.rank.ordinal(), o.rank.ordinal()); if (rankCompare != 0) { return rankCompare; } // 牌面相同时,比较花色的ordinal值 return Integer.compare(this.suit.ordinal(), o.suit.ordinal()); }
逻辑说明
- 优先比较牌面:通过
Integer.compare直接获取牌面ordinal的比较结果,正数表示当前牌面更大,负数表示更小,0则代表牌面相同。 - 牌面相等时比较花色:此时直接对比花色的ordinal值,同样用
Integer.compare返回结果,完全符合你设定的“红桃最低、黑桃最高”规则。
如果你习惯原有的if判断风格,也可以这样写
@Override public int compareTo(Card o) { if(this.rank.ordinal() > o.rank.ordinal()) { return 1; } if (this.rank.ordinal() < o.rank.ordinal()) { return -1; } // 牌面相同时,依次判断花色 if(this.suit.ordinal() > o.suit.ordinal()) { return 1; } if(this.suit.ordinal() < o.suit.ordinal()) { return -1; } return 0; }
两种写法逻辑完全一致,前者利用Java工具方法减少了冗余的if判断,代码更简洁。
内容的提问来源于stack exchange,提问作者acidic231
相关产品推荐
相关产品推荐

