2012-06-02 4 views
1

Как я могу получить арифметические операторы во время выполнения на Java? Предположим, если у меня есть значенияКак получить арифметические операторы во время выполнения?

  • ADD следует добавить номер
  • MUL, то он должен умножить число

Для примера

public calculate(int x, String str){ 
    while(str.equals("some value")){ 
    If(str.equals("ADD")) 
     // it should return me something like x+ 
    if(str.equals("MUL")) 
     it return me something like x* 
    } 
    if(str.equals("FINAL")) 
     it should return me x+x*x 

    } 
+1

Я проголосовал за закрытие как ИМО, это слишком локализовано. – home

+0

Я не понимаю вашу проблему, вы уже предоставили решение в псевдокоде. Просто верните x * x; и измените свою подпись метода на 'public int calculate (...)'. – home

+0

Привет домой Я изменил свой вопрос .. –

ответ

3

Что вам нужно, это не во время выполнения метапрограммирования, но первые функций класса.

Следующие представляют собой функции первого класса с arity 1 и 2 соответственно.

abstract class UnaryFunction<A, B> { 
    public abstract B apply(A a); 
} 

abstract class BinaryFunction<A, B, C> { 
    public abstract C apply(A a, B b); 
} 

Для простоты давайте использовать специализированные версии вышеуказанных классов.

abstract class UnaryOperation { 
    public abstract int apply(int a); 
} 

abstract class BinaryOperation { 
    public abstract int apply(int a, int b); 
} 

Теперь создайте словарь требуемых арифметических операций.

Map<String, BinaryOperation> ops = new HashMap<String, BinaryOperation>(); 
ops.put("ADD", new BinaryOperation() { 
    public int apply(int a, int b) { 
    return a + b; 
    } 
}); 
ops.put("MUL", new BinaryOperation() { 
    public int apply(int a, int b) { 
    return a * b; 
    } 
}); 
// etc. 

Добавьте метод, который частично относится BinaryOperation от одного параметра.

abstract class BinaryOperation { 
    public abstract int apply(int a, int b); 

    public UnaryOperation partial(final int a) { 
    return new UnaryOperation() { 
     public int apply(int b) { 
     return BinaryOperation.this.apply(a, b); 
     } 
    }; 
    } 
} 

Теперь мы можем написать ваш метод calculate.

public UnaryOperation calculate(int x, String opString) { 
    BinaryOperation op = ops.get(opString); 
    if(op == null) 
    throw new RuntimeException("Operation not found."); 
    else 
    return op.partial(x); 
} 

Использование:

UnaryOperation f = calculate(3, "ADD"); 
f.apply(5); // returns 8 

UnaryOperation g = calculate(9, "MUL"); 
f.apply(11); // returns 99 

Абстракции, используемые в указанном выше растворе, а именно: первый класс функциональных интерфейсов и частичное применение, являются доступными в библиотеке this.

+0

. После проверки [истории изменений вопроса] (http://stackoverflow.com/posts/10859834/revisions), я думаю, полностью упустил точку вопроса. OP должен приложить больше усилий, чтобы объяснить его дело. – missingfaktor

+0

Спасибо большое missingfaktor thats то, что мне нужно :) –

+0

@ user1431954, Я также благодарен upvote. ;) – missingfaktor

0

Предполагая, что вы пытаетесь просто добавить и умножить x, просто выполните следующие действия:

public int calculate(int x, String str) { 
    // while(true) is gonna get you into some trouble 
    if(str.equals("ADD")) { 
     return x + x; 
    } 
    else if(str.equals("MUL")) { 
     return x * x; 
    } 
    else 
     return x; // not sure what you want to do in this case 
} 
+0

Hi TreeBranch, Спасибо за ваш ответ. Я изменил свой вопрос. Я думаю, что возникла некоторая путаница. –

2
public class Calculator { 
    public static enum Operation {ADD, MUL, SUB, DIV}; 
    private int x; // store value from previous operations 

    public void calculate(int x, Operation operation) { 
     switch(operation) { 
     case ADD: 
      this.x += x; 
      break; 
     case MUL: 
      this.x *= x; 
      break; 
     case SUB: 
      this.x -= x; 
      break; 
     case DIV: 
      this.x /= x; 
      break; 
     } 
    } 

    public int getResult() { 
     return this.x; 
    } 
} 

Чтобы использовать его в другом месте в коде:

public static void main(String[] args) { 
    Calculator c = new Calculator(); 
    c.calculate(4, Calculator.Operation.ADD); 
    // Other operations 
    c.getResult(); // get final result 
} 
Смежные вопросы