【问题标题】:if there a better way to write this if statment in java如果有更好的方法在 java 中编写这个 if 语句
【发布时间】:2015-02-23 22:04:49
【问题描述】:

那么有没有办法简化它以使它更小?

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

【问题讨论】:

  • 你可以做一个方法[return boolean]来减少代码cardAt(selectedCards.get(0)).rank().equals(cardAt(selectedCards.get(1)).rank())
  • 也许创建一个执行这些验证的函数,适当地命名它并在 if 中调用它
  • 以下任何答案都能解决您的问题吗?您需要更多信息吗?请考虑接受答案,stackoverflow.com/help/someone-answers

标签: java if-statement simplify


【解决方案1】:

据我所知,您正在尝试测试这 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) {

【讨论】:

    【解决方案2】:

    这是一种选择:

    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”的结果),然后您可以在其中获得排名并比较值是否相同。

    此选项可让您获得更多代码行,但对您以外的任何人来说都更简洁、更易读。

    【讨论】:

      【解决方案3】:

      在我看来最易读:

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

      【讨论】:

      • 我想补充一点,可读性是你最应该关心的。 JVM 会将可读代码编译和优化成与其他可能看起来更高效的实现相同的指令集。考虑到这一点,我觉得这个解决方案非常好。
      猜你喜欢
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多