-1

重複の可能性:
文字列をコードに変換

有効なJavaコードを含む文字列を評価する必要があります

例えば。6私はから得ることができるはずですString code="Math.abs(2*3);";

4

2 に答える 2

1

これは非常に興味深いアイデアのように聞こえますが、アプリケーションの目的は何でしょうか。

最善の策は、サポートする既知のパターンの辞書を作成することです。

私の最初のアイデアは、受け入れられたパターンのArrayListを作成する必要があるということです。したがって、たとえば:

ArrayList<String> acceptedPatterns = new ArrayList<String>();
acceptedPatterns.add("math.abs");
acceptedPatterns.add("math.acos");

次に、文字列を取得したときにこのリストを評価できます。

String foundPattern = null;
String myStringFromInput = editText.getText();
for (String pattern : acceptedPatterns){
  if (myStringFromInput.contains(pattern){
     // we have recognised a java method, flag this up
     foundPattern = pattern;
     break;
  }
}

この時点で、foundPattern変数に「Math.abs」が含まれているはずです。

次に、このメソッドがどのように機能するかについての知識を使用して計算できます。私は超効率的な方法を考えることはできませんが、少なくともあなたを動かす基本的な方法は、大きなif /elseステートメントのようなものになるでしょう:

int result = 0;
if (foundPattern.contains("Math.abs"){
   result = computeMathAbs(myStringFromInput);
}else if (foundPattern.contains("Math.acos"){
   // etc
}

そして、computeMathAbsメソッドで、次のようなことを行います。

private int computeMathAbs(String input){
   int indexOfBracket = input.indexOf("(");
   int indexOfCloseBracket = input.indexOf(")");
   String value = input.subString(indexOfBracket,indexOfCloseBracket);
   int valueInt = computeFromString(value);
   int result = Math.abs(valueInt);
   return result;
}

次に、返された結果を表示できます。

ComputeFromString ()メソッドは同様のことを行い、*記号または他の記号を探し、これをabsの例のように乗算に変換します。

明らかにこれは基本的な例であるため、一度に1つのJavaメソッドしか計算できないため、一度に複数のメソッドの複雑さをプログラミングするのは非常に難しいと思います。

また、かなりのエラー処理を入れて、ユーザーが完全なJavaを入力しない可能性があることを認識する必要があります。ワームの缶。

于 2012-11-30T10:41:26.080 に答える
0

http://groovy.codehaus.org/api/groovy/util/Eval.htmlを使用できますGroovy

import groovy.util.Eval;

... 

    HashMap<String, Object> params = new HashMap<String, Object>();
    params.put("a", 2);
    params.put("b", 3);

    Integer res = (Integer) Eval.me("param", params, "Math.abs(param.a * param.b)");

    System.out.println("res with params = " + res);

    System.out.println("res without params = " + Eval.me("Math.abs(2*3)"));
于 2012-11-30T11:32:23.020 に答える