3

プログラムが最初に2つのペアをチェックした後でのみ、1つのペアを認識するのに問題があります。最初に1つのペアをチェックすると、問題がないことがわかります。しかし、最初に2つのペアをチェックしてから、1つのペアをチェックすると、それが見つかりません。どんな助けでもいただければ幸いです。

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

問題は、hand2 つのペアを探すときに変更していることです。

   hand.removeAll(checkedPair);

したがって、getTwoPair()完了すると、唯一のペアは手から取り除かれ、機能しcheckPair()なくなります。

getTwoPair()邪魔にならないようにする必要があります。

または、2 つのメソッドを 1 つに組み合わせて、見つかったペアの数に応じて、0、2、または 4 枚のカードを返すこともできます。

于 2013-01-21T21:29:38.727 に答える
0

getTwoPair最初の操作を実行すると、checkPair(hand);これはペア (必要なペア) を見つけて削除し、再度チェックを試みます。このチェックが失敗すると、リターンします。

リターンの後、(1) ペアが取り除かれたハンドと (2) からのヌル リターンが残りますgetTwoPair。この結果により、メイン フローは続行されますが、削除されたため、単一のペアを見つけることができない状態が残ります。

配列リストのコピーを作成して検索することをお勧めします。2 つのペアが見つからない場合は、単純に元の配列を返します。トウのペアが見つかった場合は、変更された配列を返します。

于 2013-01-21T21:30:01.473 に答える