Эй, ребята, мне было интересно, есть ли какой-нибудь способ вернуть определенную долю кучи булевых в java. Проще говоря, я хотел бы узнать, есть ли способ создать метод, который при задании четырех булевых, если три из них верны, возвращает true, но если значение меньше трех, оно возвращает false. Я знаю, что это может быть трудно понять, и если вы не понимаете, просто опубликуйте комментарий.Как вернуть ответ трех четвертей булевых в java
ответ
Weird вопрос ... в любом случае, здесь возможное решение для всего 4 булевых:
public boolean booleanFraction(boolean a, boolean b, boolean c, boolean d) {
int ia = a ? 1 : 0;
int ib = b ? 1 : 0;
int ic = c ? 1 : 0;
int id = d ? 1 : 0;
return ia + ib + ic + id == 3;
}
Для более общего решение, вот метод, который получает в качестве параметров количество логических элементов, которые должны быть true
для рассмотрения true
всего выражения и большего, чем нулевое переменное число b oolean значения:
public static boolean booleanFraction(int number, boolean... bools) {
int acc = 0;
for (boolean b : bools)
acc += b ? 1 : 0;
return acc == number;
}
вызовов это так, для примера в вопросе:
booleanFraction(3, true, true, true, false);
> true
booleanFraction(3, false, false, true, false);
> false
Это кажется немного жестким. –
@HunterMcMillen В вопросе упоминается только 4 булевых. Если было возможно больше, OP должен указать критерии для определения того, какая часть логических данных должна быть верной, чтобы рассмотреть всю цепочку логических значений true. –
@HunterMcMillen В любом случае. Я изменил свой ответ, теперь является таким же общим, каким он может быть. –
Просто создайте int, который увеличивается на 1 для каждого true. Если оно больше или равно 3, верните true. Сказав это, я не знаю, где вы застряли, поскольку это кажется слишком рудиментарным, чтобы даже упомянуть.
графа истинные находится в массиве ...
public boolean checkBools(boolean[] bools){
int cnt=0;
for(boolean b : bools)
if(b) cnt++;
return cnt < 3 ? false : true;
}
public boolean checkBooleans(boolean b1, boolean b2, boolean b3, boolean b4) {
boolean[] array = new boolean[4];
boolean[0] = b1;
boolean[1] = b2;
boolean[2] = b3;
boolean[3] = b4;
int j = 0;
for(int i = 0; i < array.length; i++) {
if(array[i]) {
j++;
}
if(j == 3) {
return true;
}
}
return false;
}
Если вы хотите, чтобы ваш ответ как выражение boolean
, вы можете попробовать,
boolean atLeastThree(boolean a, boolean b, boolean c, boolean d) {
return a ? (b && (c || d) || (c && d)) : (b && c && d);
}
Подсчет количества true
s немного более изящный и понятный,
boolean atLeastThree(boolean a, boolean b, boolean c, boolean d) {
return (a ? 1 : 0) +
(b ? 1 : 0) +
(c ? 1 : 0) +
(d ? 1 : 0) > 2;
}
boolean nOfM(int n, boolean... m) {
for (boolean mi : m) if (mi) n--;
return n < 1;
}
Использование потоков:
static boolean threeOrMore(Boolean... bools) {
return Stream.of(bools).filter(x -> x).count() >= 3;
}
Разновидность моего ответа на 2-out-of-3 problem:
boolean atLeastThree(boolean a, boolean b, boolean c, boolean d)
{
int n = -3;
if (a) n++;
if (b) n++;
if (c) n++;
if (d) n++;
return (n >= 0);
}
На самом деле, вы действительно должны сначала опубликовать вашу попытку с вашим вопросом как лучше прояснить проблему а также показать плоды ваших усилий. –