Как преобразовать символ в арифметическую операцию?
Сгенерировал арифметическую операцию, но результат выдает неверный, потому что воcпринимает под char конкретное значение из юникода.
Как этот случайный char представить именно операцией (сложение, вычитание)?
String str = "-+*";
int z = (int) (Math.random() * str.length());
char ch = str.charAt(z);
Если я попытаюсь посчитать, например, int result = (x + ch + y), то в качестве ch будет взято число из таблицы юникода, а хотелось бы получить сгенерированный символ.
Ответы (1 шт):
Сгенерировал арифметическую операцию -- не совсем так, был сгенерирован символ операции, полученный из строки.
Для применения некой операции к неким числам следует сопоставить значение символа с неким действием, например, при помощи switch:
- обычный оператор
switch
int result;
switch (ch) {
case '+': result = x + y; break;
case '-': result = x - y; break;
case '*': result = x * y; break;
default: throw new IllegalArgumentException("Bad operation: " + ch);
}
switch-выражение (Java 14+):
int result = switch (ch) {
case '+' -> x + y;
case '-' -> x - y;
case '*' -> x * y;
default -> throw new IllegalArgumentException("Bad operation: " + ch);
};
Однако, в Java можно определить операции, используя функциональные интерфейсы, в данном случае может подойти IntBinaryOperator, принимающий два аргумента и возвращающий результат типа int, или же BiFunction<T1,T2,R>, для которого можно дополнительно специфицировать типы аргументов и результата.
IntBinaryOperator add = (a, b) -> a + b;
IntBinaryOperator sub = (a, b) -> a - b;
IntBinaryOperator mul = (a, b) -> a * b;
IntBinaryOperator[] ops = {sub, add, mul};
int x = 10;
int y = 20;
for (int i = 0; i < 5; i++) {
IntBinaryOperator op = ops[(int)(Math.random() * ops.length)];
System.out.println("Random op of x and y = " + op.applyAsInt(x, y));
}
Random op of x and y = 200
Random op of x and y = -10
Random op of x and y = 30
Random op of x and y = 30
Random op of x and y = 200