Калькулятор для метрич. c расстояния от выражения, содержащего разные масштабы. - PullRequest
0 голосов
/ 20 июня 2020
public enum Operator {
PLUS("+"),
MINUS("-");

private final String operator;

Operator(String operator) {
    this.operator = operator;
}

public String getOperator() {
    return operator;
}

public static Operator getByValue(String operator) {
    for (Operator operatorEnum : Operator.values()) {
        if (operatorEnum.getOperator().equals(operator)) {
            return operatorEnum;
        }
    }

    throw new IllegalArgumentException("Invalid value");
}
}

//////////

 public enum MetricConvertor {
m(1000),
cm(10),
mm(1),
km(1000000),
dm(100);

private int scale;

MetricConvertor(int scale) {
    this.scale = scale;
}

public int getScale() {
    return scale;
}

}

/////////

 public class Application {

public static void main(String[] args) {

    int scale = MetricConvertor.valueOf("m").getScale();
}

Я хочу создать калькулятор, который может вычислять метрич. c значение расстояния из выражения, которое содержит различные шкалы и системы.

Выходные данные должны быть указаны пользователем.

Разрешены только сложение и вычитание.

Вывод в нижнем блоке.

Выражение: 10 см + 1 м - 10 мм

Результат: 1090 мм

Я застрял на этом этапе, как Могу ли я добавить или вычесть значения для списка и преобразовать их в системе с самым низким масштабом (например, выше мм, но это может быть dm, если добавляются, например, dm + m + km)

1 Ответ

0 голосов
/ 20 июня 2020

Вот решение

  1. разделить каждую строку на добавление / минус и добавить ее в соответствующий список
  2. номер разделения и метри c в каждом списке (можно использовать сопоставитель) и просуммировать его
  3. результат = sumAdd - sumMinus (мм).
    Пожалуйста, оптимизируйте его, потому что у меня нет времени на оптимизацию этого кода, мне нужно go, чтобы спать: D
    Результат в мм, поэтому вам нужно получить наименьшее значение c и пересчитать его (оставьте его тебе).
private static int caculator(String exp) {
    List<String> addList = new ArrayList<>();
    List<String> minusList = new ArrayList<>();
    int checkPoint = 0;
    boolean op = true;//default first value is plus
    // Split string with add/minus
    for (int i = 1; i < exp.length(); i++) {
        String s = exp.substring(i, i + 1);
        if (Operator.PLUS.getOperator().equals(s)) {
            checkOperator(addList, minusList, op, exp.substring(checkPoint, i).trim());
            checkPoint = i + 1;
            op = true;
            continue;
        }
        if (Operator.MINUS.getOperator().equals(s)) {
            checkOperator(addList, minusList, op, exp.substring(checkPoint, i).trim());
            checkPoint = i + 1;
            op = false;
            continue;
        }
    }
    // Add last string
    checkOperator(addList, minusList, op, exp.substring(checkPoint).trim());
    // Get sum each list
    int sumAdd = sumList(addList);
    int sumMinus = sumList(minusList);

    return sumAdd - sumMinus;
}
//sum a list
private static int sumList(List<String> addList) {
    int sum = 0;
    for (String s: addList) {
        String[] arr = s.split(" ");
        int value = Integer.parseInt(arr[0]);
        int scale = MetricConvertor.valueOf(arr[1]).getScale();
        sum += value * scale;
    }
    return sum;
}
// check operator to put into approriate list
private static void checkOperator(List<String> addList, List<String> minusList, boolean op, String substring) {
    if (op) {
        addList.add(substring);
    } else {
        minusList.add(substring);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...