Последовательные логические операции с элементами varargs
Застрял на логических операциях в массиве. Необходимо: создать метод, который принимал бы на вход переменную String c двумя значениями OR или AND, а также varargs с булевыми значениями: static boolean getResult(String operand, boolean... args). Данный метод должен осуществить логическую операцию (указанную в переменной String) над каждым элементом varargs аргумента и вернуть результат вычисления. К сожалению, аналогия с суммой элементов массива(где изначально объявляется переменная, скажем int sum=0, а потом к ней прибавляются все элементы массива не подходит, так как первоначальное булево значение может быть разным). Я написал код
static boolean getResult(String operand, boolean...args) {
boolean result= false;
switch (operand) {
case ("OR"):
for (int i=0; i< args.length-1; i++) {
for (int j = i+1; j < args.length; j++) {
result = args[i] || args[j];
break;
}
}
case("AND"):
for (int i=0; i< args.length-1; i++) {
for (int j = i+1; j < args.length; j++) {
result = args[i] && args[j];
}
}
break;
}
return result;
}
Но похоже, что он не работает корректно. Основная проблема: как последовательно провести логические операции И (ИЛИ) с элементами массива по порядку. Заранее благодарен
Ответы (1 шт):
Здесь не нужны вложенные циклы, достаточно пройтись по массиву один раз, а вот первоначальное значение будет определяться по типу операции: для AND таким значением будет true, для OR - false:
static boolean getResult(String operand, boolean...args) {
boolean result = false;
switch (operand) {
case "OR":
for (int i = 0; !result && i < args.length; i++) {
result |= args[i];
}
break;
case "AND":
result = true;
for (int i = 0; result && i < args.length; i++) {
result &= args[i];
}
break;
}
return result;
}
Также можно применить Stream API: проитерировать массив args при помощи потока индексов, полученных при помощи IntStream::range, и используя методы allMatch / anyMatch для AND / OR соответственно для вычисления результата; для проверки типа операции можно применить switch expression:
static boolean getResult(String operand, boolean...args) {
return switch(operand) {
case "AND" -> IntStream.range(0, args.length).allMatch(i -> args[i]);
case "OR" -> IntStream.range(0, args.length).anyMatch(i -> args[i]);
default -> false;
};
}
Тесты (для любой реализации):
System.out.println(getResult("AND", true, true, true)); // -> true
System.out.println(getResult("AND", true, false, true)); // -> false
System.out.println(getResult("OR", false, true, false)); // -> true
System.out.println(getResult("OR", false, false, false)); // -> false