Как вычислить арифметическое уравнение, где оператор - строка

Я пытаюсь оценить уравнение, случайно сгенерированное системой, где два целых числа хранятся в массиве, а оператор находится в отдельном строковом массиве. Я хочу сравнить ответ с ответом пользователя. вот мой код:

Integer[] array;
String[] operators = {"+", "-", "*", "/"};
String question;
int operator = 0;

public void generateSum(){
    for (int x = 0; x < 2; x++) {
        Random randomNumber = new Random(); //creating random object
        int number = randomNumber.nextInt(100) + 1; 
        Random randomOperator = new Random();
        operator = randomOperator.nextInt(3);
        array[x] = (number);
    }
    question = array[0].toString() + operators[operator] + array[1].toString() + " = ";
    TextView txt = findViewById(R.id.txtQuestion);
    txt.setText(question);
}

Сопоставить строку с обратным вызовом с операцией ... использовать перечисление с методом операции ... создать класс с именем и методом операции ... Использовать кортеж с именем и обратным вызовом как пару ... Метод обратного вызова, очевидно, должен принимать два целых числа в качестве параметров и возвращать результат данной операции ...

Selvin 14.03.2018 22:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
1
42
2

Ответы 2

Вы можете вызвать эту функцию и передать массив целых чисел и оператор в качестве параметров, и вы получите результат операции:

public int result(int[]array, int operator){
    switch(operator){
        case 0: // addition
            return array[0]+array[1];
            break;
        case 1: // subtraction
            return array[0]-array[1];
            break;
        case 2: // multiplication
            return array[0]*array[1];
            break;
        case 3: // division - result rounded up to integer
            return array[0]/array[1];
            break;
        default: // this shouldn't happen
            return 0;  
     }
}

Затем вы можете сравнить ответ, данный пользователем, с рассчитанным результатом.

Кстати, ваш массив должен иметь тип int [], а не Integer []. int - это примитивный тип, представляющий целое число, а Integer - это класс со многими статическими функциями и одним полем int. Если вам интересно, вы можете прочитать этот пост о разнице между int и Integer:

What is the difference between Integer and int in Java?

Что, если бы у вас был интерфейс, который выглядел бы так:

interface Operator {
    public String getView();
    public int operate(int v1, int v2);
}

поэтому вместо операторов String [] у вас будут операторы Operator [].

Тогда ваш цикл не будет зависеть от вашей реализации, у вас будет просто:

question = "" + array[0] + operators[operator].getView() + 
     array[1] + " = " + operators[operator].operate(array[0],array[1]); 

Теперь, как вы реализуете метод операции, зависит от вас, это может быть 4 разных класса, реализующих Operator, или это могут быть перечисления, реализующие Operator, или это может быть один класс, который действует по-разному, если он был построен с помощью «+» или "-" прошло.

Приятно то, что вы можете полностью изменить реализацию Operaton отдельно от остальной логики. Также будет легче понять две части.

Например, один класс «Плюс» может быть реализован следующим образом:

public class Plus implements Operator
{
    public String getView(){return "+";}
    public int operate(int v1, int v2){return v1+v2)
}

Реализация 4 таких классов - это торт. Конечно, вы могли бы сделать больше (например, Lambda или базовый класс, который реализует getView (), поэтому вашим подклассам нужно только реализовать операцию () ...)

(Обратите внимание, что в моем втором блоке кода начало с "" + - это уловка "Начать" как строку, которая устраняет необходимость в .toString () в массиве [0] и делает длину строки менее неудобной)

Другие вопросы по теме