0

我正在编写一个方法,并想知道附加代码是否有效,具体取决于它的编写方式:

    public boolean isThreeOfKind(PlayingCard[] hand)
    {
//            if(hand[0].getRank() == hand[2].getRank())
//                return true;
//            else if(hand[1].getRank() == hand[3].getRank())
//                return true;
//            else if(hand[2].getRank() == hand[4].getRank())
//                return true;

        return (hand[0].getRank() == hand[2].getRank() || 
                hand[1].getRank() == hand[3].getRank() || 
                hand[2].getRank() == hand[4].getRank());
    }

所以你可以看到我有一个 if else if 语句被注释掉了,一个 return 语句基本上做同样的事情,这会更有效并且符合编码标准?

4

4 回答 4

9

效率上没有区别,但风格上肯定有区别,第二个要好得多。然而,这个特殊的逻辑真的只是

for (int i = 0; i < 3; i++) 
  if (hand[i].getRank() == hand[i+2].getRank()) return true;
return false;
于 2012-05-17T18:17:46.330 回答
3

这种类型的问题在CodeReview上可能会更好,因为它更多的是一种意见。但是在我看来,阅读未注释的部分要容易得多,并且在它成为问题之前不应该担心性能(尤其是在这样的情况下)。有关更多信息,请参阅 Wikipedia 上的程序优化文章,尤其是何时优化部分。

于 2012-05-17T18:18:58.530 回答
0

或者,如果您只喜欢方法和数组边界检查中的一个退出点:

boolean found = false;
for (int i = 0; !found && i < hand.length - 2; i++) 
    found = (hand[i].getRank() == hand[i + 2].getRank());
return found;
于 2012-05-17T20:58:30.147 回答
0

正如杰弗里所说,在这种情况下,我会说可读性比效率更有价值(我不会说这是普遍规则)。

您可能对名为Short-Circuit Evaluation的概念感兴趣。请注意|| 是 Java 中的短路运算符。因此,如果第一个语句为真(其他两个不会被评估),您将获得与 if 语句相同的效果。

话虽如此,我不确定这两段代码是否编译成同一个函数(它们可能取决于编译器的实现)。如果他们不编译相同,第二个可能会更快。

于 2012-05-17T18:26:16.240 回答