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
相关产品推荐
相关产品推荐

