统计同一类型对象的ArrayList中重复属性的个数



我正在尝试创建一个类,该类评估每个扑克玩家的两张发牌和五张桌牌,并返回发现的重复数量。例如,如果一个玩家得到一张a和一张2,而桌子是Ace, Three, Four, Ace, Five,那么它应该返回"玩家1有三张牌"。这是我目前得到的结果,准确率约为50%,但有时它会忽略玩家有多个配对,或者错误地计算出有多少次重复。下面是一个控制台输出示例

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;
duplicateFaces(sevenCards);
}
public void duplicateFaces(ArrayList<Card> cards) {
int duplicateCount = 0;
String card = "";
ArrayList<String> dupCards = new ArrayList<String>();
for (int i = 0; i < cards.size(); i++) {
for (int j = i + 1; j < cards.size(); j++) {
if ((cards.get(i).getFace()).equals(cards.get(j).getFace())) {
if (!dupCards.contains(cards.get(j).getFace())) {
duplicateCount++;
dupCards.add(cards.get(j).getFace());
card = cards.get(j).getFace();
}
}
}
dupCards = new ArrayList<String>();
}
if (duplicateCount > 1) {
returnDuplicates(duplicateCount, card);
}
}
public void returnDuplicates(int count, String card) {
System.out.println("Player " + player + " had " + count + " " + card + "s");
}
}

正如在评论中提到的,您只有一个duplicateCountcard变量的实例,在所有卡面之间共享,这将不起作用。此外,这一行if (!dupCards.contains(cards.get(j).getFace()))将只计数重复的第一次发现他们,但如果你有三张相同的卡呢?

这是一个带有注释的解决方案,使用Hashmap与卡面作为关键,并将值作为计数,这样您可以轻松地使用单个for循环跟踪每个卡面并根据需要增加计数:

//Use a hashmap to store the cards
HashMap<String, Integer> results = new HashMap<>();
//Updated method to count duplicates
public void duplicateFaces(ArrayList<Card> cards) {
//Use a single loop and update each card in the hashmap
for (int i = 0; i < cards.size(); i++) {
//Incriment count of duplicate card if found
if (results.containsKey(cards.get(i).getFace())) {
results.get(cards.get(i).getFace())++;
}
//Else enter new card with value of 1 (No duplicates yet)
else {
results.put(cards.get(i).getFace(), 1);
}
}
//Now print the duplicates
for (Map.Entry<String, Integer> entry : results.entrySet())
{
//Print out any cards that are found more than once
if (entry.getValue() > 1){
returnDuplicates(entry.getValue(), entry.getKey());
}
}
}
//Existing print method
public void returnDuplicates(int count, String card) {
System.out.println("Player " + player + " had " + count + " " + card + "s");
}

最新更新