我的程序在首次检查两对之后才识别出一对,我遇到了问题。首先检查一对时它发现没问题。但是当我首先检查这两对时,检查一对它找不到它。任何帮助将不胜感激。
package card.game.simulator;
import java.util.ArrayList;
public class RankingUtility {
private RankingEnum rank;
public String getRankOfHand(ArrayList<Card> hand) {
System.out.printf("%s\n", hand.toString());
ArrayList<Card> rankingCards = getTwoPair(hand);
if(rankingCards != null) {
return "Two Pair!";
}
System.out.printf("%s\n", hand.toString());
rankingCards = getOnePair(hand);
if(rankingCards != null) {
return "One Pair!";
}
System.out.printf("%s\n", hand.toString());
return "You got nuthin...";
}
public boolean isSameSuit(ArrayList<Card> hand) {
CardSuitEnum suit = hand.get(0).getSuit();
for(Card card : hand) {
if(card.getSuit() != suit) {
return false;
}
}
return true;
}
public ArrayList<Card> checkPair(ArrayList<Card> hand) {
ArrayList<Card> checkedPair = new ArrayList<>();
for(Card card1 : hand) {
checkedPair.add(card1);
for(Card card2 : hand) {
if(!card1.equals(card2) && card1.getFace().equals(card2.getFace())) {
checkedPair.add(card2);
return checkedPair;
}
}
checkedPair.clear();
}
return null;
}
public ArrayList<Card> getTwoPair(ArrayList<Card> hand) {
ArrayList<Card> twoPair = new ArrayList<>();
ArrayList<Card> checkedPair = checkPair(hand);
if(checkedPair != null) {
twoPair.addAll(checkedPair);
hand.removeAll(checkedPair);
}
checkedPair = checkPair(hand);
if(checkedPair != null) {
twoPair.addAll(checkedPair);
return twoPair;
}
return null;
}
public ArrayList<Card> getOnePair(ArrayList<Card> hand) {
return checkPair(hand);
}
}
答案 0 :(得分:5)
在checkTwoPair
你正在做hand.removeAll()
。这是从基础ArrayList
中删除它。这就是你之后没有找到它的原因。
答案 1 :(得分:3)
问题在于,在寻找两对时,您正在修改hand
:
hand.removeAll(checkedPair);
因此当getTwoPair()
完成时,唯一的一对已从手中删除,checkPair()
不再有效。
您需要getTwoPair()
非侵入性。
或者,您可以将两种方法合并为一种,根据已找到的对数,返回零,两张或四张卡片。
答案 2 :(得分:0)
当您运行getTwoPair
时,您执行的第一个操作是checkPair(hand);
这会找到该对(您想要的那个)将其删除,然后再次尝试检查。当此检查失败时,它将返回。
在返回之后,你留下(1)一对移除了对的手,以及(2)从getTwoPair
返回的空值。这个结果会让你有一个条件导致主流继续,但由于它已被删除,因此无法找到单个对。
我建议制作要搜索的数组列表的副本。如果找不到两对,只需返回原始数组即可。如果找到两对,则返回修改后的数组。