Java统计ArrayList对象重复属性 扑克手牌重复牌面计数问题排查
扑克手牌重复牌面统计类实现问题
你正在开发扑克评估类,需要组合玩家2张手牌+5张公共牌,统计重复牌面结果:比如玩家持有Ace、Two,公共牌为Ace、Three、Four、Ace、Five时,需要输出Player 1 had three aces。当前代码准确率仅50%,存在两个核心问题:
- 漏判多对子牌型
- 重复牌数量统计错误
现有代码问题根因
原实现的逻辑存在3个明确bug:
- 计数逻辑完全错误:用双重循环找配对时,
duplicateCount统计的是「两两配对的组合数」不是「同牌面总张数」——比如3张Ace会产生3组两两配对,原逻辑会得到计数3,和实际牌数的对应关系完全混乱;且每次外层循环都重置dupCards列表,根本无法累计同牌面的出现次数。 - 多对子漏判:仅用单个字符串
card存储最后一个匹配到的重复牌面值,如果同时存在两对(比如一对Ace+一对King),先遍历到的对子会直接被覆盖丢失。 - 触发条件错误:判断
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
相关产品推荐
相关产品推荐

