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

Java统计ArrayList对象重复属性 扑克手牌重复牌面计数问题排查

扑克手牌重复牌面统计类实现问题

你正在开发扑克评估类,需要组合玩家2张手牌+5张公共牌,统计重复牌面结果:比如玩家持有Ace、Two,公共牌为Ace、Three、Four、Ace、Five时,需要输出Player 1 had three aces。当前代码准确率仅50%,存在两个核心问题:

  • 漏判多对子牌型
  • 重复牌数量统计错误

现有代码问题根因

原实现的逻辑存在3个明确bug:

  1. 计数逻辑完全错误:用双重循环找配对时,duplicateCount统计的是「两两配对的组合数」不是「同牌面总张数」——比如3张Ace会产生3组两两配对,原逻辑会得到计数3,和实际牌数的对应关系完全混乱;且每次外层循环都重置dupCards列表,根本无法累计同牌面的出现次数。
  2. 多对子漏判:仅用单个字符串card存储最后一个匹配到的重复牌面值,如果同时存在两对(比如一对Ace+一对King),先遍历到的对子会直接被覆盖丢失。
  3. 触发条件错误:判断duplicateCount >1才输出结果,一对(2张同牌)的场景会被直接过滤,完全不符合牌型统计要求。

修正后的实现代码

正确统计思路应该先统计每个牌面的出现频次,再根据频次输出结果,不要用双重循环数配对数:

package edu.sbcc.cs105;

import java.util.*;

public class Evaluate {
    ArrayList<Card> sevenCards = new ArrayList<Card>();
    int player;
    String faces[] = { "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King",
            "Ace" };

    public Evaluate(Card c1, Card c2, Card c3, Card c4, Card c5, Card c6, Card c7, int p) {
        sevenCards.clear();
        sevenCards.add(c1);
        sevenCards.add(c2);
        sevenCards.add(c3);
        sevenCards.add(c4);
        sevenCards.add(c5);
        sevenCards.add(c6);
        sevenCards.add(c7);
        this.player = p;
        countDuplicateFaces(sevenCards);
    }

    public void countDuplicateFaces(ArrayList<Card> cards) {
        // 用HashMap统计每个牌面的出现次数:key为牌面值,value为出现次数
        HashMap<String, Integer> faceCount = new HashMap<>();
        for (Card card : cards) {
            String face = card.getFace();
            faceCount.put(face, faceCount.getOrDefault(face, 0) + 1);
        }

        // 遍历统计结果,输出所有重复牌面(出现次数≥2)
        for (Map.Entry<String, Integer> entry : faceCount.entrySet()) {
            int count = entry.getValue();
            String face = entry.getKey();
            if (count >= 2) {
                String countText;
                switch (count) {
                    case 2:
                        countText = "a pair of";
                        break;
                    case 3:
                        countText = "three";
                        break;
                    case 4:
                        countText = "four";
                        break;
                    default:
                        countText = String.valueOf(count);
                }
                printResult(countText, face);
            }
        }
    }

    public void printResult(String countText, String card) {
        System.out.println("Player " + player + " had " + countText + " " + card + "s");
    }
}

修正点说明

  • 用HashMap做频次统计,时间复杂度从原实现的O(n²)降到O(n),从根源上避免计数错误
  • 遍历所有牌面的统计结果,不会漏判多对子、三条、四条的场景
  • 修正输出触发条件,只要牌面出现次数≥2就输出,不会漏掉一对的场景
  • 兼容对子的输出格式,避免出现"2 aces"这类不符合需求的输出,完全匹配你给出的示例规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:18:22