Как устранить случай переключения или если-еще? и выполнить следующие операции? - PullRequest
0 голосов
/ 26 октября 2019

ниже приведен код:

public String evaluate() {

    if (this.data.equals("+")) {
      return String.valueOf(Double.parseDouble(this.children.get(0).evaluate()) + Double.parseDouble(this.children.get(1).evaluate()));
    } 

else if (this.data.equals("-")) {
      return String.valueOf(Double.parseDouble(this.children.get(0).evaluate()) - Double.parseDouble(this.children.get(1).evaluate()));
    } 

else if (this.data.equals("*")) {
      return String.valueOf(Double.parseDouble(this.children.get(0).evaluate()) * Double.parseDouble(this.children.get(1).evaluate()));
    } 

else {
      return String.valueOf(Double.parseDouble(this.children.get(0).evaluate()) / Double.parseDouble(this.children.get(1).evaluate()));
    }

  } 

значение this.data содержит операнд в виде строки. Есть ли способ полностью исключить if-else, уменьшить количество строк кода? Нет также использовать регистр переключателей.

Есть ли способ преобразовать строку в операнд в java .?

Ответы [ 2 ]

2 голосов
/ 27 октября 2019

Существует довольно элегантный способ реализовать это поведение с помощью enum. Поскольку перечисления java - это не просто перечисления (как в других языках программирования), но либо полные классы, вы можете написать это перечисление (простой пример для '+' и '*'):

public enum Operation {
 PLUS("+") {
            @Override
            public int apply(int value1, int value2) {
                return value1 + value2;
            }
        },
MULTIPLY("*") {
            @Override
            public int apply(int value1, int value2) {
                return value1 * value2;
            }
};

private final String symbol;

private static final Map<String, Operation> STRING_TO_ENUM = Arrays.stream(Operation.values()).collect(Collectors.toMap(Operation::toString, e -> e));

private Operation(String symbol) {
     this.symbol = symbol;
}

public static Operation fromString(String symbol) {
    return STRING_TO_ENUM.get(symbol);
}

@Override
public String toString() {
    return symbol;
}

public abstract int apply(int value1, int value2);
}

и уменьшить оценкудо:

public evaluate() {
    return Operation.fromString(this.data).apply(value1, value2);
} 
1 голос
/ 26 октября 2019

Этот вопрос задавался несколько раз ранее, и, насколько я могу судить по прочтению ответов (и моего собственного опыта работы с java), не существует нативной функции java (например, expression.eval ()), которая бы выполняла ваширабота. Основная причина этого может заключаться в том, что Java никогда не может знать, откуда берутся выражения / значения, и поэтому не может предоставить общее решение, которое удовлетворяет, например, как проверке входных данных, так и полноте и т. Д.

Однако (!), Как обычноумные люди садились и кодировали свои собственные решения. Вы можете найти это или , что ТАК Вопросы / Ответы полезно. В ответах перечислено несколько решений вашей проблемы.

В зависимости от вашего варианта использования, вы можете не захотеть слишком усложнять вещи. Например, если вы хотите оценить только четыре операнда / типа выражения, которые вы включили выше, вы можете просто «перенести» свой код в свою собственную библиотеку и, таким образом, сохранить свой основной класс в чистоте, не обращаясь к стороннему коду.

Я знаю, это не тот ответ, на который вы надеялись. Считайте, что это шанс углубить ваше понимание и знание языка.

Очевидно, что cou также может перенести вашу логику на язык, который поддерживает оценку строковых выражений.

Счастливое кодирование

...