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

効率に違いはありませんが、スタイルに明確な違いがあり、2 番目の方がはるかに優れています。ただし、この特定のロジックは実際には

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の方が良いかもしれません。しかし、私の意見では、コメントされていない部分を読む方がはるかに簡単であり、パフォーマンスが問題になるまで心配する必要はありません (特にこのような場合)。詳細については、ウィキペディアのプログラム最適化の記事、特に最適化のタイミングのセクションを参照してください。

于 2012-05-17T18:18:58.530 に答える
0

Jeffery が言ったように、この場合、読みやすさは効率よりも価値があると思います (それが普遍的なルールであるとは言いません)。

Short-Circuit Evaluationという概念に興味があるかもしれません。||注意してください。Java の短絡演算子です。そのため、最初のステートメントが true の場合、if ステートメントと同じ効果が得られます (他の 2 つのステートメントは評価されません)。

そうは言っても、これらの 2 ビットのコードが同じ関数にコンパイルされるかどうかはわかりません (コンパイラの実装によって異なる場合があります)。それらが同じようにコンパイルされない場合、2 番目の方が高速になる可能性があります。

于 2012-05-17T18:26:16.240 に答える
0

または、メソッドと配列の境界チェックで出口点を 1 つだけにしたい場合は、次のようにします。

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 に答える