Java实现5张扑克牌单对判断:排除多牌型误判问题
扑克牌单对牌型的Java判断优化方案
问题背景
我正在尝试用Java编写一个方法,用于判断5张扑克牌手牌是否仅为单对牌型。目前该方法能识别单对,但无法在出现两对、四条、葫芦等其他牌型时返回false。
最初通过遍历组合并用^运算符做排他判断,但遇到两对时仍返回true;后来尝试添加计数变量统计配对次数,结果还是误判。希望找到不用重复判断其他牌型的简洁优化方案。
优化思路:统计牌点频率
单对的核心特征是:5张牌中恰好有一个牌点出现2次,其余三个牌点各出现1次。通过统计每个牌点的出现次数,就能直接匹配这个特征,同时排除所有不符合的牌型(两对、三条、四条、葫芦等)。
实现代码(使用HashMap)
public boolean isPair() { Map<Integer, Integer> rankFrequency = new HashMap<>(); // 统计每个牌点的出现次数 for (Card card : hand) { int rank = card.getRank(); rankFrequency.put(rank, rankFrequency.getOrDefault(rank, 0) + 1); } int pairCount = 0; for (int count : rankFrequency.values()) { if (count == 2) { pairCount++; } else if (count != 1) { // 出现3次、4次的情况,直接不符合单对 return false; } } // 恰好只有一个对子才符合条件 return pairCount == 1; }
无集合替代方案(使用数组)
如果偏好数组实现(假设牌点范围为0-12,对应2到A):
public boolean isPair() { int[] rankCounts = new int[13]; // 扑克牌共13种不同点数 for (Card card : hand) { rankCounts[card.getRank()]++; } int pairCount = 0; for (int count : rankCounts) { if (count == 2) { pairCount++; } else if (count > 2) { return false; } } return pairCount == 1; }
方案优势
- 逻辑直观:直接匹配单对的频率特征,无需复杂的组合判断
- 高效简洁:时间复杂度为O(1)(手牌固定5张),代码量少且易维护
- 自动排除所有不符合牌型:无需额外判断两对、葫芦等情况,只要频率不符合就直接返回false
内容的提问来源于stack exchange,提问作者GrasshopperAtBest
相关产品推荐
相关产品推荐

