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

Java按指定花色点数规则排序扑克牌:结果不符预期求修正

修正扑克牌自定义顺序排序问题

你当前的扑克牌排序逻辑依赖从字符串末尾递归比较ASCII字符,这无法匹配自定义的花色(梅花C < 方块D < 红桃H < 黑桃S)和点数(2<3<4<5<6<7<8<9<10<J<Q<K<A)规则,导致像10C和AC这类牌的顺序错误(现有输出将AC放在10C前,而预期是10C在AC前)。

解决方案

核心思路是用自定义优先级映射替代ASCII比较,明确每张牌的花色和点数对应的排序权重,再基于权重进行排序。

步骤1:定义优先级映射表

创建两个映射,分别存储花色和点数的排序优先级数值,数值越小排序越靠前:

import java.util.*;

public class PokerSorter {
    // 花色优先级:C(梅花) < D(方块) < H(红桃) < S(黑桃)
    private static final Map<Character, Integer> SUIT_PRIORITY = new HashMap<>();
    // 点数优先级:2 < 3 < ... < 10 < J < Q < K < A
    private static final Map<String, Integer> RANK_PRIORITY = new HashMap<>();

    static {
        // 初始化花色优先级
        SUIT_PRIORITY.put('C', 0);
        SUIT_PRIORITY.put('D', 1);
        SUIT_PRIORITY.put('H', 2);
        SUIT_PRIORITY.put('S', 3);

        // 初始化点数优先级
        RANK_PRIORITY.put("2", 0);
        RANK_PRIORITY.put("3", 1);
        RANK_PRIORITY.put("4", 2);
        RANK_PRIORITY.put("5", 3);
        RANK_PRIORITY.put("6", 4);
        RANK_PRIORITY.put("7", 5);
        RANK_PRIORITY.put("8", 6);
        RANK_PRIORITY.put("9", 7);
        RANK_PRIORITY.put("10", 8);
        RANK_PRIORITY.put("J", 9);
        RANK_PRIORITY.put("Q", 10);
        RANK_PRIORITY.put("K", 11);
        RANK_PRIORITY.put("A", 12);
    }

步骤2:实现牌面解析与排序逻辑

编写工具方法提取每张牌的点数和花色,然后用自定义比较器对牌列表排序:

// 提取牌的点数(处理10的特殊情况:牌面长度为3时,前两位是点数)
    private static String extractRank(String card) {
        return card.length() == 3 ? card.substring(0, 2) : card.substring(0, 1);
    }

    // 提取牌的花色(始终是最后一位字符)
    private static char extractSuit(String card) {
        return card.charAt(card.length() - 1);
    }

    // 排序方法:替代原有sortEnd2Begin
    public static List<String> sortPokerCards(String[] inputCards) {
        List<String> cardList = new ArrayList<>(Arrays.asList(inputCards));
        cardList.sort((card1, card2) -> {
            // 解析两张牌的花色和点数
            char suit1 = extractSuit(card1);
            String rank1 = extractRank(card1);
            char suit2 = extractSuit(card2);
            String rank2 = extractRank(card2);

            // 先比较花色:花色优先级不同时直接返回差值
            int suitCompare = SUIT_PRIORITY.get(suit1) - SUIT_PRIORITY.get(suit2);
            if (suitCompare != 0) {
                return suitCompare;
            }
            // 花色相同时,比较点数优先级
            return RANK_PRIORITY.get(rank1) - RANK_PRIORITY.get(rank2);
        });
        return cardList;
    }

    // 测试示例
    public static void main(String[] args) {
        String[] input = {"4H", "5H", "8C", "8D", "9H", "9D", "AC", "6S", "5D", "6D", "KD", "10C", "AD"};
        List<String> sorted = sortPokerCards(input);
        System.out.println(String.join(" ", sorted));
        // 输出:8C 10C AC 5D 6D 8D 9D KD AD 4H 5H 9H 6S
    }
}

原有逻辑失效原因

原有beforeOrAfter方法从字符串末尾递归比较ASCII值,完全忽略了自定义规则:

  • 对于10C和AC,末尾都是C,往前比较时10C的第二个字符是0(ASCII 48),AC的第一个字符是A(ASCII 65),原逻辑会判定AC的字符更大,因此排在10C前面,这和需求中10优先级低于A的规则矛盾。
  • 自定义映射表直接明确了每个元素的排序权重,避免了ASCII值带来的逻辑偏差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:12:06