Hier ist ein allgemeiner, testbasierter Ansatz. Nicht so "effizient" wie die meisten der bisher angebotenen Lösungen, aber klar, getestet, funktionierend und verallgemeinert.
public class CountBooleansTest extends TestCase {
public void testThreeFalse() throws Exception {
assertFalse(atLeastTwoOutOfThree(false, false, false));
}
public void testThreeTrue() throws Exception {
assertTrue(atLeastTwoOutOfThree(true, true, true));
}
public void testOnes() throws Exception {
assertFalse(atLeastTwoOutOfThree(true, false, false));
assertFalse(atLeastTwoOutOfThree(false, true, false));
assertFalse(atLeastTwoOutOfThree(false, false, true));
}
public void testTwos() throws Exception {
assertTrue(atLeastTwoOutOfThree(false, true, true));
assertTrue(atLeastTwoOutOfThree(true, false, true));
assertTrue(atLeastTwoOutOfThree(true, true, false));
}
private static boolean atLeastTwoOutOfThree(boolean b, boolean c, boolean d) {
return countBooleans(b, c, d) >= 2;
}
private static int countBooleans(boolean... bs) {
int count = 0;
for (boolean b : bs)
if (b)
count++;
return count;
}
}
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.