Выполнить арифметическое выражение в Android - PullRequest
1 голос
/ 16 ноября 2011

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

String DataTmp[10][3] = ...;
String strCalc = "Float.parseFloat(DataTmp[i][0]) + Float.parseFloat(DataTmp[i][2]) * Float.parseFloat(DataTmp[i][1])";

Есть ли способ достичь этого?

Отредактировано: Вышеприведенный пример приведен, например.Это не фиксированный расчет.Это может измениться в любом случае, например,

String strCalc = "Float.parseFloat(DataTmp[i][1]) / Float.parseFloat(DataTmp[i][2])";

или

String strCalc = "(Float.parseFloat(DataTmp[i][2]) - Float.parseFloat(DataTmp[i][1])) / Float.parseFloat(DataTmp[i][1])";

Так что я не могу просто выполнить этот динамический расчет.Мне нужно выполнить выражение внутри строки.

Далее отредактировано:

У пользователя есть текстовое поле для ввода расчета.
Итак, пользователь введет что-тонапример, «(поле 1 - поле 3) / поле 2» или что угодно, как они хотят.
Мне нужно взять соответствующее значение для полей из массива и применить операцию (+, -, *, /) в соответствии с пользователемвыбор.
Все в этом выражении является динамическим, включая порядок полей и операции.




Решение реализовано: здесь естьдолгое возможное решение, которое я достиг.добавить улучшения, если у вас есть.я не реализовал иерархию расчетов, основанную на скобках.

              strCalc = strCalc.replace("(", "");
              strCalc = strCalc.replace(")", "");

              List<String> calcList = new ArrayList<String>(Arrays.asList(strCalc
                          .split(" ")));
              showInfo("List Size : " + calcList.size());
              // Doing multiplication and division first
              for (int i = 0; i < calcList.size(); i++) {
                    String curStr = calcList.get(i);
                    if (curStr.compareTo("*") == 0) {
                          float val1 = Float.parseFloat(calcList.get(i - 1));
                          float val2 = Float.parseFloat(calcList.get(i + 1));
                          calcList.remove(i - 1);
                          calcList.remove(i - 1);
                          calcList.remove(i - 1);
                          float result = val1 * val2;
                          calcList.add(i - 1, "" + result);
                          i--;
                          continue;
                    }
                    if (curStr.compareTo("/") == 0) {
                          float val1 = Float.parseFloat(calcList.get(i - 1));
                          float val2 = Float.parseFloat(calcList.get(i + 1));
                          calcList.remove(i - 1);
                          calcList.remove(i - 1);
                          calcList.remove(i - 1);
                          float result = val1 / val2;
                          calcList.add(i - 1, "" + result);
                          i--;
                          continue;
                    }
              }
              // Doing addition and subtraction next
              for (int i = 0; i < calcList.size(); i++) {
                    String curStr = calcList.get(i);
                    if (curStr.compareTo("+") == 0) {
                          float val1 = Float.parseFloat(calcList.get(i - 1));
                          float val2 = Float.parseFloat(calcList.get(i + 1));
                          calcList.remove(i - 1);
                          calcList.remove(i - 1);
                          calcList.remove(i - 1);
                          float result = val1 + val2;
                          calcList.add(i - 1, "" + result);
                          i--;
                          continue;
                    }
                    if (curStr.compareTo("-") == 0) {
                          float val1 = Float.parseFloat(calcList.get(i - 1));
                          float val2 = Float.parseFloat(calcList.get(i + 1));
                          calcList.remove(i - 1);
                          calcList.remove(i - 1);
                          calcList.remove(i - 1);
                          float result = val1 - val2;
                          calcList.add(i - 1, "" + result);
                          i--;
                          continue;
                    }
              }
              return calcList.get(0);

Ответы [ 2 ]

0 голосов
/ 16 ноября 2011

Индексируйте случайный столбец и строку в массиве DataTmp, а затем просто выполняйте расчет. Убедитесь, что вы используете правильное приведение, поскольку вы используете строковые массивы.

0 голосов
/ 16 ноября 2011

выбранный вами способ должен работать

float result = Float.parseFloat(DataTmp[i][0]) + Float.parseFloat(DataTmp[i][2]) * Float.parseFloat(DataTmp[i][1]);
String strCalc = String.valueOf(result);

Но вы должны быть осторожны: убедитесь, что в вашем массиве DataTmp есть плавающие числа (проверив их перед выполнением операции), и вы также можете захотеть добавить некоторое форматирование к результату.

...