3

我的程序只有在第一次检查两对后才能识别一对。当首先检查一对时,它发现它没问题。但是当我先检查两对然后检查一对时,它没有找到它。任何帮助,将不胜感激。

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);
}
}
4

3 回答 3

5

checkTwoPair你正在做的hand.removeAll()。这是从底层移除它ArrayList。这就是为什么您事后找不到它的原因。

于 2013-01-21T21:29:02.270 回答
3

问题是您hand在寻找两对时正在修改:

   hand.removeAll(checkedPair);

因此,当getTwoPair()完成时,唯一的一对已从手中取出,checkPair()不再起作用。

你需要做到getTwoPair()非侵入式。

或者,您可以将这两种方法合二为一,根据找到的对数返回零、两张或四张牌。

于 2013-01-21T21:29:38.727 回答
0

当您运行getTwoPair第一个操作时,您会checkPair(hand);发现这对(您想要的那个)将其删除,然后尝试再次检查。当此检查失败时,它会返回。

在返回后,您将得到 (1) 已移除对子的手和 (2) 从getTwoPair. 这个结果给你留下了一个条件,导致主流继续,但找不到单对,因为它被删除了。

我建议制作一个数组列表的副本以进行搜索。如果找不到两对,只需返回原始数组。如果找到两对,则返回修改后的数组。

于 2013-01-21T21:30:01.473 回答