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

如何按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 04:57:04