如何按Map存储对象的enum属性排序,先按Best后按Rank处理平局
Java扑克游戏玩家牌型排序实现方案
核心逻辑:Java枚举自带的ordinal()方法返回值和枚举定义顺序完全一致,你给出的Best、Rank枚举都是按照优先级从高到低定义的,优先级越高的枚举ordinal()返回值越小,排序时我们只要基于该值做逆序比较即可。
1. 先补全Combinaison类的Getter方法
你定义的类属性是私有访问权限,排序时需要读取属性值,首先补充Getter:
public class Combinaison { private Best best; // 注意:你这里属性类型写的是Card.Ranks,你定义的枚举名为Rank,需先确认类型统一 private Rank highest; public Best getBest() { return best; } public Rank getHighest() { return highest; } // 保留你原有构造方法即可 public Combinaison(Best best, Rank highest) { this.best = best; this.highest = highest; } }
2. 排序实现代码
HashMap本身是无序容器,排序后我们需要用LinkedHashMap来保留排序后的顺序,实现代码如下:
import java.util.*; import java.util.stream.Collectors; // 你的原有代码逻辑省略... // 排序逻辑 LinkedHashMap<String, Combinaison> sortedMap = combinaisonList.entrySet().stream() .sorted((entry1, entry2) -> { Combinaison c1 = entry1.getValue(); Combinaison c2 = entry2.getValue(); // 优先比较Best牌型优先级,逆序:值小的优先级更高排前面 int bestCompare = Integer.compare(c1.getBest().ordinal(), c2.getBest().ordinal()); if (bestCompare != 0) { return bestCompare; } // 牌型相同,比较Rank大小,同样逆序 return Integer.compare(c1.getHighest().ordinal(), c2.getHighest().ordinal()); }) // 收集为有序的LinkedHashMap .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (oldVal, newVal) -> oldVal, LinkedHashMap::new ));
3. 效果验证
你给出的测试用例中:
- comb1的
FLUSH枚举ordinal值为4,comb2的STRAIGHT枚举ordinal值为5 - 4 < 5,所以FLUSH优先级更高,排序后Player1会排在Player2前面,符合规则。
小提示:你当前的Rank枚举存在拼写错误:HEIGHT应为EIGHT、FIX应为FIVE、FOR应为FOUR,建议修正避免后续逻辑出错。
内容的提问来源于stack exchange,提问作者CoffeeRun
相关产品推荐
相关产品推荐

