Hier finden Sie die Antworten (bis jetzt):
public class X
{
static boolean a(final boolean a, final boolean b, final boolean c)
{
return ((a && b) || (b && c) || (a && c));
}
static boolean b(final boolean a, final boolean b, final boolean c)
{
return a ? (b || c) : (b && c);
}
static boolean c(final boolean a, final boolean b, final boolean c)
{
return ((a & b) | (b & c) | (c & a));
}
static boolean d(final boolean a, final boolean b, final boolean c)
{
return ((a?1:0)+(b?1:0)+(c?1:0) >= 2);
}
}
und lassen sie durch den Decompiler laufen (javap -c X > results.txt):
Compiled from "X.java"
public class X extends java.lang.Object{
public X();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
static boolean a(boolean, boolean, boolean);
Code:
0: iload_0
1: ifeq 8
4: iload_1
5: ifne 24
8: iload_1
9: ifeq 16
12: iload_2
13: ifne 24
16: iload_0
17: ifeq 28
20: iload_2
21: ifeq 28
24: iconst_1
25: goto 29
28: iconst_0
29: ireturn
static boolean b(boolean, boolean, boolean);
Code:
0: iload_0
1: ifeq 20
4: iload_1
5: ifne 12
8: iload_2
9: ifeq 16
12: iconst_1
13: goto 33
16: iconst_0
17: goto 33
20: iload_1
21: ifeq 32
24: iload_2
25: ifeq 32
28: iconst_1
29: goto 33
32: iconst_0
33: ireturn
static boolean c(boolean, boolean, boolean);
Code:
0: iload_0
1: iload_1
2: iand
3: iload_1
4: iload_2
5: iand
6: ior
7: iload_2
8: iload_0
9: iand
10: ior
11: ireturn
static boolean d(boolean, boolean, boolean);
Code:
0: iload_0
1: ifeq 8
4: iconst_1
5: goto 9
8: iconst_0
9: iload_1
10: ifeq 17
13: iconst_1
14: goto 18
17: iconst_0
18: iadd
19: iload_2
20: ifeq 27
23: iconst_1
24: goto 28
27: iconst_0
28: iadd
29: iconst_2
30: if_icmplt 37
33: iconst_1
34: goto 38
37: iconst_0
38: ireturn
}
Sie können sehen, dass die ?: etwas besser sind als die korrigierte Version Ihres Originals. Am besten ist diejenige, bei der die Verzweigung ganz vermieden wird. Das ist gut im Hinblick auf weniger Anweisungen (in den meisten Fällen) und besser für die Verzweigungsvorhersageteile der CPU, da eine falsche Schätzung bei der Verzweigungsvorhersage zum Abwürgen der CPU führen kann.
Ich würde sagen, die effizienteste ist die von moonshadow insgesamt. Sie verwendet im Durchschnitt die wenigsten Anweisungen und verringert die Gefahr von Pipeline-Störungen in der CPU.
Um 100 % sicher zu sein, müssten Sie die Kosten (in CPU-Zyklen) für jede Anweisung herausfinden, was leider nicht ohne weiteres möglich ist (Sie müssten sich die Quelle für Hotspot und dann die Spezifikationen des CPU-Anbieters für die Zeit ansehen, die für jede generierte Anweisung benötigt wird).
Siehe die aktualisierte Antwort von Rotsor für eine Laufzeitanalyse des Codes.
173 Stimmen
Integrieren Sie die Return-Anweisung.
82 Stimmen
atLeastTwo(iWantYou, iNeedYou, imEverGonnaLoveYou)
1 Stimmen
Wäre es C gewesen, hätte man die Booleschen Werte einfach addieren können. Vielleicht war es das, woran er dachte, aber er vergaß, dass Java das nicht kann?
6 Stimmen
Thorbjørn: Verwendet C nicht zero/nonzero für bools? Ich glaube nicht, dass das in C überhaupt funktionieren würde, z.B.,
atLeastTwo(0,2,0)
.1 Stimmen
Ihr Gesprächspartner sollte "verbessert" definieren, bevor Sie etwas anderes tun können. Die Einfügung von if/else wäre vernünftig, aber alles andere beweist nur, wie schlau sie sind.
3 Stimmen
Ken, Sie könnten !! verwenden, um sicherzustellen, dass der Wert entweder 1 oder 0 ist, d.h. (!!A + !!B + !!C)>=2. Dennoch ist die unten angegebene ?: Version besser.
2 Stimmen
@Ken: Nach C99 muss man immer dann, wenn man aus einem
bool
erhalten Sie immer entweder 0 oder 1. Daher würde das Zusammenzählen in C99 immer funktionieren.3 Stimmen
LOL, das ist es, was mein Lehrer für funktionale Programmierung als "Boolesche Angst" bezeichnen würde: Anstatt das vollkommen akzeptable Ergebnis eines booleschen Ausdrucks zu verwenden, wird eine Kontrollstruktur verwendet, um es zu umhüllen und entweder Wahr oder Falsch zurückzugeben. Offenbar wirkt es beruhigend, wenn man genau sieht, was man zurückgibt, anstatt den logischen Operatoren zu vertrauen.
5 Stimmen
Return true; //math joke : if vs if and only if
93 Stimmen
Warum bewerten die Leute die trivialsten Fragen hoch?
4 Stimmen
Ernsthaft, wie kann das 78 Bewertungen bekommen?
52 Stimmen
Fragen, die allgemein und leicht verständlich sind, erhalten viele Stimmen. Fragen, die sehr spezifisch und technisch sind, nicht.
0 Stimmen
Sollte eine separate Frage gestellt werden, wie Sie dies in Ihrer Lieblingssprache tun würden, und die Antworten, die nicht aus Java stammen, dorthin verschoben werden?
0 Stimmen
Es wird nicht nur hochgestuft, sondern sogar als Favorit markiert (47 Favoriten). WOW!
1 Stimmen
@BlueRaja-DannyPflughoeft die einfachen Fragen werden hochgevotet, weil jeder sie versteht, und diese Frage hat auch ein paar gute Antworten bekommen.
1 Stimmen
125 Interviewer haben sich für diese Frage entschieden. Und sie werden bekommen, was sie verdient haben ;)
0 Stimmen
Sie können eine Methode schreiben wie getTrueValuesSize(boolean[] values) { List<Boolean> trueValues = new ArrayList(); for (int i = 0; i < values.length; i++) { if (values[i] == true) { trueValues.add(bolArray[i]); } }} // wenn die Anzahl der Bedingungen zunimmt, wird es schwer zu pflegen und fehleranfällig, wenn die Bedingung oder das Schließen der Klammern nicht richtig erfolgt.
0 Stimmen
@BlueRaja-DannyPflughoeft, de.wikipedia.org/wiki/Parkinson's_law_of_triviality
2 Stimmen
Es kommt darauf an, was "verbessern" hier bedeutet: Lesbarkeit oder Leistung.