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

  }
4

3 に答える 3

3

必要なのはランタイム メタプログラミングではなく、ファースト クラスの関数です。

以下は、アリティがそれぞれ 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.

1 つのパラメーターに部分的に適用されるメソッドを追加し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

上記のソリューションで使用されている抽象化、つまりファースト クラス関数インターフェイスと部分適用は、両方ともこのライブラリで利用できます。

于 2012-06-02T07:04:40.340 に答える
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
}
于 2012-06-02T04:50:32.967 に答える
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
}
于 2012-06-02T04:45:11.390 に答える