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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:15:11