如何将5张手牌按从高到低排序?如何拆分字符串数组为子数组?
扑克牌手从高到低排序实现
字符串拆分问题修正
你写的拆分逻辑有个基础错误:Java里String是不可变对象,split()方法不会修改原字符串,执行后会返回拆分好的新数组,你之前没有接收这个返回值,所以永远拿不到拆分后的牌面值和花色。
修正后的拆分写法:
String[] handDeck = {"Ace spades", "Five hearts", "Four spades", "King diamonds", "Queen diamonds"}; // 二维数组存解析后的牌,每个元素对应[牌面值, 花色] String[][] parsedCards = new String[handDeck.length][2]; for (int i = 0; i < handDeck.length; i++) { // 按空格切分,接收返回的拆分结果 String[] cardParts = handDeck[i].split(" "); parsedCards[i][0] = cardParts[0]; parsedCards[i][1] = cardParts[1]; }
牌面排序实现思路
不要直接用字符串默认排序——字典序下首字母A的ASCII码比K小,直接排序会把Ace排到King后面,结果完全错误。
正确做法是先给每个牌面值绑定固定权重,按权重排序:
牌面权重对应规则(权重越高牌越大):
- Ace → 14
- King → 13
- Queen → 12
- Jack → 11
- Ten → 10
- 数字牌9到2权重依次为9到2
排序时直接比对两张牌对应的权重值,做降序排列即可,完整可运行参考代码:
import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.Map; public class PokerSorter { public static void main(String[] args) { String[] handDeck = {"Ace spades", "Five hearts", "Four spades", "King diamonds", "Queen diamonds"}; // 初始化牌面权重映射 Map<String, Integer> rankMap = new HashMap<>(); rankMap.put("Two", 2); rankMap.put("Three", 3); rankMap.put("Four", 4); rankMap.put("Five", 5); rankMap.put("Six", 6); rankMap.put("Seven", 7); rankMap.put("Eight", 8); rankMap.put("Nine", 9); rankMap.put("Ten", 10); rankMap.put("Jack", 11); rankMap.put("Queen", 12); rankMap.put("King", 13); rankMap.put("Ace", 14); // 自定义比较器,按牌面权重降序排序 Arrays.sort(handDeck, new Comparator<String>() { @Override public int compare(String c1, String c2) { int weight1 = rankMap.get(c1.split(" ")[0]); int weight2 = rankMap.get(c2.split(" ")[0]); // 降序:权重大的排前面 return weight2 - weight1; } }); // 输出排序结果 for (String card : handDeck) { System.out.println(card); } } }
运行输出顺序:
Ace spades
King diamonds
Queen diamonds
Five hearts
Four spades
如果后续需要追加同牌面下的花色排序规则,只要在两个牌权重相等的判断分支里,再加一层花色权重的比对逻辑即可。
内容的提问来源于stack exchange,提问作者hobbyiscoding
相关产品推荐
相关产品推荐

