Я пытаюсь оценить уравнение, случайно сгенерированное системой, где два целых числа хранятся в массиве, а оператор находится в отдельном строковом массиве. Я хочу сравнить ответ с ответом пользователя. вот мой код:
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);
}




Вы можете вызвать эту функцию и передать массив целых чисел и оператор в качестве параметров, и вы получите результат операции:
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:
Что, если бы у вас был интерфейс, который выглядел бы так:
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] и делает длину строки менее неудобной)
Сопоставить строку с обратным вызовом с операцией ... использовать перечисление с методом операции ... создать класс с именем и методом операции ... Использовать кортеж с именем и обратным вызовом как пару ... Метод обратного вызова, очевидно, должен принимать два целых числа в качестве параметров и возвращать результат данной операции ...