如果有更好的方法在java中编写这个if语句

时间:2015-02-23 22:04:50

标签: java if-statement simplify

那么有没有办法简化这个以使其更小?

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 个答案:

答案 0 :(得分:3)

从我可以看到你试图测试3张牌是否有不同的等级。一种更简单的测试方法是将它们放入一个Set中,看看设置的大小是否与选定的set相同。这可以扩展到任意数量的选定卡片......

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) {

答案 1 :(得分:0)

这是一个选择:

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 )

我建议创建一个名为&#34; CompareRanks&#34;你收到3个不同的对象(&#34; cardAt&#34;的结果)并在那里得到排名并比较值是否相同。

此选项可引导您使用更多代码行,但除了您之外的任何人都更清晰,更易读。

答案 2 :(得分:0)

在我看来最具可读性:

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