簡體   English   中英

如果有更好的方法在Java中編寫if語句

[英]if there a better way to write this if statment in java

那么,有沒有一種方法可以簡化它,使其變得更小?

else if(selectedCards.size() == 3
            && cardAt(selectedCards.get(0)).pointValue() + cardAt(selectedCards.get(1)).pointValue() + cardAt(selectedCards.get(2)).pointValue() == 0 
            && !cardAt(selectedCards.get(0)).rank().equals(cardAt(selectedCards.get(1)).rank()) 
            && !cardAt(selectedCards.get(0)).rank().equals(cardAt(selectedCards.get(2)).rank())
            && !cardAt(selectedCards.get(1)).rank().equals(cardAt(selectedCards.get(2)).rank()))

從我可以看到的角度來看,您正在嘗試測試3張卡的排名是否不同。 一種更簡單的測試方法是將它們放入集合中,並查看集合大小是否與所選集合相同。 這可以縮放到任意數量的選定卡...

public boolean differentRanks(List<Integer> selectedCards) {
    Set<Integer> ranks = new HashSet<Integer>();
    for (int card : selectedCards) {
        ranks.add(cardAt(card).rank());
    }
    return ranks.size() == selectedCards.size();
}

我還將創建一種方法來匯總所選卡的積分...

public int sum(List<Integer> selectedCards) {
    int total;
    for (int card : selectedCards) {
        total += cardAt(card).pointValue();
    }
    return total;
}

這樣情況就結束了

} else if (selectedCards.size() == 3 && sum(selectedCards) == 0 && 
           differentRanks(selectedCards) {

這將是一種選擇:

else if(selectedCards.size() == 3
        && cardAt(selectedCards.get(0)).pointValue() +        cardAt(selectedCards.get(1)).pointValue() + cardAt(selectedCards.get(2)).pointValue() == 0 
        && !(cardAt(selectedCards.get(0)).rank().equals(cardAt(selectedCards.get(1)).rank())).equals(cardAt(selectedCards.get(2)).rank()) )

為了使這種情況更具可讀性,您可以執行以下操作:

//here you extract the values you need only once and use them in your condition block below
        int cardsSize = selectedCards.size();
        int pointValue0 = cardsSize == 3 ? cardAt(selectedCards.get(0)).pointValue() : 0;
        int pointValue1 = cardsSize == 3 ? cardAt(selectedCards.get(1)).pointValue() : 0;
        int pointValue2 = cardsSize == 3 ? cardAt(selectedCards.get(2)).pointValue() : 0;           
        bool rankEquals = CompareRanks(cardAt(selectedCards.get(0)),cardAt(selectedCards.get(1)),cardAt(selectedCards.get(2));

        if (<condition>) {
            //block of sentences
        } else if (cardsSize == 3 && (pointValue0 + pointValue1 + pointValue2) == 0 && !rankEquals )

我建議創建一個名為“ CompareRanks”的函數,在該函數中您將收到3個不同的對象(“ cardAt”的結果),並在其中獲得排名,並比較值是否相同。

此選項使您可以執行更多的代碼行,但對於除您之外的任何人來說更清晰,可讀性更好。

我認為最易讀:

else if(selectedCards.size() == 3 && checkRanks(selectedCards))
{
    //...
}

//...

private boolean checkRanks(List<Card> cards)
{
    Card zeroCard = cardAt(selectedCards.get(0));
    Card firstCard = cardAt(selectedCards.get(1));
    Card secondCard = cardAt(selectedCards.get(2));

    boolean isZero = zeroCard.pointValue() + firstCard.pointValue() +      secondCard.pointValue() == 0;

    boolean zeroCardRankNotEqualFirst = !zeroCard.rank().equals(firstCard.rank())
    boolean zeroCardRankNotEqualSecond = !zeroCard.rank().equals(secondCard.rank())
    boolean firstCardRankNotEqualsSecond = !firstCard.rank().equals(secondCard.rank()); 

    return isZero && zeroCardRankNotEqualFirst && zeroCardRankNotEqualSecond && firstCardRankNotEqualsSecond;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM