我正在编写一个方法,并想知道附加的代码是否有效,具体取决于它的编写方式:
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语句基本上做同样的事情,哪个更有效并且根据编码标准?
答案 0 :(得分:9)
效率没有差别,但风格有明显差异,第二个更好。但是,这个特殊的逻辑真的只是
for (int i = 0; i < 3; i++)
if (hand[i].getRank() == hand[i+2].getRank()) return true;
return false;
答案 1 :(得分:3)
CodeReview这类问题可能会更好,因为它更多的是一种观点。但在我看来,阅读未评论的部分要容易得多,性能不应该担心,直到它成为一个问题(特别是在这样的事情)。有关详细信息,请参阅维基百科上的程序优化文章,尤其是When to Optimize部分。
答案 2 :(得分:0)
正如杰弗瑞所说,我认为在这种情况下,可读性比效率更有价值(我不认为这是一个普遍的规则)。
您可能对名为Short-Circuit Evaluation的概念感兴趣。请注意 ||是Java中的短路运算符。因此,如果第一个语句为真,您将获得与if语句相同的效果(其他两个将不会被评估)。
话虽如此,我不确定这两行代码是否编译成相同的函数(它们可能取决于编译器实现)。 如果他们没有编译相同,第二个可能会更快。
答案 3 :(得分:0)
或者,如果您只想在方法和数组边界检查中使用一个退出点:
boolean found = false;
for (int i = 0; !found && i < hand.length - 2; i++)
found = (hand[i].getRank() == hand[i + 2].getRank());
return found;