2015-08-22 2 views
-3

В программе Java, у меня есть эти строки:обнаруживая тип оператора хранится в виде строки в Java

a= 8,7,"+" 
b=1,5,"*" 

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

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

+0

Вы не можете записывать такие строки, как на Java. Не могли бы вы правильно форматировать строки. –

+2

'Enum.valueOf()' будет стандартной методикой, или поиском карты, или переключателем, но могут ли они избежать вашего состояния-фобии только вы можете сказать. Если у вас есть * фактическое * ограничение какого-либо рода, пожалуйста, сообщите об этом. Возможно, вы ищете стандартного оценщика RPN? Их достаточно просто написать, но не тогда, когда вы указываете произвольные ограничения. – EJP

+0

Искусственные ограничения, подобные этому, звучат ужасно, как домашнее задание. –

ответ

1

Другим решением от ответа J. Сельва'S:

Усовершенствования

  1. одного класса
  2. статический блок
  3. лучше абстракции

импорта java.util.HashMap; импорт java.util.Карта;

/** 
* Created by SEA-HAWK on 23/8/15. 
*/ 
public abstract class Expr { 
    public static Map<String,Object> op; 
    static{ 
     op=new HashMap<>(); 
     op.put("+", new Expr() { 
      @Override 
      public int evaluate(int a, int b) { 
       return a + b; 
      } 
     }); 
     op.put("-", new Expr() { 
      @Override 
      public int evaluate(int a, int b) { 
       return a - b; 
      } 
     }); 
     op.put("*", new Expr() { 
      @Override 
      public int evaluate(int a, int b) { 
       return a * b; 
      } 
     }); 

     op.put("/", new Expr() { 
      @Override 
      public int evaluate(int a, int b) { 
       return a/b; // decimal point loss 
      } 
     }); 
    } 
    abstract public int evaluate(int a, int b); 
    public static int exprEval(String expr){ 
     String a[]=expr.split(","); 
     a[2]=a[2].replaceAll("\"",""); 
     return ((Expr)op.get(a[2])).evaluate(Integer.parseInt(a[0]),Integer.parseInt(a[1])); 
    } 
} 

Основная функция:

public static void main(String[] args) { 
    String x="20,10,\"*\""; 
    System.out.println(x+"="+Expr.exprEval(x)); 
    x="20,10,\"+\""; 
    System.out.println(x+"="+Expr.exprEval(x)); 
    x="20,10,\"-\""; 
    System.out.println(x+"="+Expr.exprEval(x)); 
    x="20,10,\"/\""; 
    System.out.println(x+"="+Expr.exprEval(x)); 
} 

Выход:

20,10,"*"=200 
20,10,"+"=30 
20,10,"-"=10 
20,10,"/"=2 

Примечание: изменение типа данных для поплавка/вычисления десятичного значения.

-1

Вы можете преобразовать постфиксное выражение в математическое выражение infix и выполнить его с помощью анализатора выражений в Java или javascript (не рекомендуется). Как вы рекомендуете Java, следующая ссылка поможет вам:

evaluating-a-math-expression-given-in-string-form

java-parse-a-mathematical-expression-given-as-a-string-and-return-a-number

Ответ свыше двух звеньев:

Вы можете передать его в BeanShell bsh.Interpreter, что-то вроде этого:

Interpreter interpreter = new Interpreter(); 
interpreter.eval("result = 5+4*(7-15)"); 
System.out.println(interpreter.get("result")); 

Сообщите нам, если ваш вопрос будет устранен.

+0

OP уже исключил JavaScript. Обе ссылки относятся к инфиксной нотации. Этот вопрос касается RPN. – EJP

+0

Решение работает, только если вы преобразуете постфиксное выражение в infix. Я должен упомянуть это явно. Я обновлю его. – seahawk

+0

Это было бы совершенно бессмысленно. Выражение в RPN уже подходит для прямой оценки. Обе ваши ссылки преобразуют выражение infix в RPN, а затем оценивают его. Нельзя всерьез предлагать перенести RPN-> инфиксное преобразование перед этим. – EJP

0

Сначала Разделите строку и сохраните оператор в переменной Character. Вы можете использовать split(), чтобы разделить String и назначить его массиву String. Оператор доступа использует индекс массива и назначает его переменной символа.

Теперь вы можете использовать Map<Character,Object>, где вы можете хранить символ и объект для вычисления в единой структуре и получить доступ позже с символом только без if-else или switch.

Map<Character,Object> map = new HashMap<>(); 
map.put('+', plusObject); 
map.put('-', minusObject); 
map.put('*', multiplyObject); 
map.put('/', divideObject); 

Чтобы получить тип объекта оператора, вы можете использовать map.get(character) он возвращает объект в соответствии с характером и нуль в противном случае.

Обновление: создать четыре класса и объект для каждого класса, а именно: plusObject, minusObject, multiplyObject, divideObject. Это объекты, которые вы добавляете к HashMap изначально. Имейте функцию evaluate() в каждом классе. Теперь с возвращенным объектом вызовите метод evaluate(), который сделает вызов соответствующего класса. Вам не нужно проверять тип Object, используя любые условные операторы.

+0

моей главной проблемой является конец вашего утверждения «Теперь на основе возвращенного объекта ...». проверяя возвращаемый объект, требуется условие, я не могу использовать условия – Fcoder

+0

О да. скоро будет проверяться и обновляться, если я получу любую другую идею. –

+0

@Fcoder сделал у вас обновление? –

Смежные вопросы