Как преобразовать символ в арифметическую операцию?

Рейтинг: 0Ответов: 1Опубликовано: 04.05.2023

Сгенерировал арифметическую операцию, но результат выдает неверный, потому что воcпринимает под char конкретное значение из юникода.

Как этот случайный char представить именно операцией (сложение, вычитание)?

String str = "-+*";
int z = (int) (Math.random() * str.length());
char ch = str.charAt(z);

Если я попытаюсь посчитать, например, int result = (x + ch + y), то в качестве ch будет взято число из таблицы юникода, а хотелось бы получить сгенерированный символ.

Ответы

▲ 3Принят

Сгенерировал арифметическую операцию -- не совсем так, был сгенерирован символ операции, полученный из строки.

Для применения некой операции к неким числам следует сопоставить значение символа с неким действием, например, при помощи 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