23

D / Bから一連の列値を取得し、それを条件としてチェックする必要があります。

たとえば、D/B列にのような文字列があり"value > 2"ます"4 < value < 6"。(値は常に比較される値です)。コードで変数値を宣言し、この条件を評価する必要があります。

int value = getValue();
if (value > 2)  //(the string retrieved from the D/B)
  doSomething();

これどうやってするの??どんな助けでも大歓迎です。ありがとう。

4

8 に答える 8

35

標準(Java 1.6以降)のスクリプトライブラリを使用した例を次に示します。

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Test {

    public static void main(String[] args) throws Exception {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");

        engine.eval("value = 10");
        Boolean greaterThan5 = (Boolean) engine.eval("value > 5");
        Boolean lessThan5 = (Boolean) engine.eval("value < 5");

        System.out.println("10 > 5? " + greaterThan5); // true
        System.out.println("10 < 5? " + lessThan5); // false
    }
}
于 2012-06-06T16:09:17.453 に答える
1

些細なことではありません。データベースで使用される式言語用のパーサーが必要です。それが標準的で明確に指定された言語である場合は、インターネットで見つけることができるかもしれませんが、社内のものである場合は、独自の言語を作成する必要があります(おそらく、ANTLRなどのパーサジェネレータを使用します)。

javax.scriptパッケージには、Javascriptインタープリターなどの外部スクリプトエンジンを統合するためのツールがいくつか含まれています。別のアイデアは、スクリプトエンジンを導入し、それに式をフィードすることです。

于 2012-06-06T16:05:40.123 に答える
1

基本的に、スクリプト化された式を評価しています。その式で許可されているものに応じて、非常に単純なもの(グループを識別する正規表現)または非常に複雑なもの(javascriptエンジンを埋め込む?)を回避できます。

式が次のような単純なケースを見ていると仮定します。[boundary0][operator]"value" [operator] [boundary1]

[境界][演算子]グループの両方ではなく、一方が省略される場合があります。(両方が存在する場合、演算子は同じである必要があります)

グループをキャプチャする場合は、正規表現を使用します。

次のようなもの:(?:(\ d +)\ s *([<>])\ s *)?value(?:\ s *([<>])\ s *(\ d +))?

そして:boundary1 = group(1); operator1 = group(2); operator2 = group(3); border2 = group(4)

于 2012-06-06T16:07:01.960 に答える
0

ifステートメント内の文字列を次のように解析してみてください。

if(parseMyString(getValue()))
    doSomething();

parseMyStringでは、条件について何を評価する必要があるかを判断できます。パーサーの作成方法がわからない場合は、http ://www.javapractices.com/topic/TopicAction.do?Id=87を参照してください。

于 2012-06-06T16:08:05.213 に答える
0

最大限の柔軟性で条件を評価するには、埋め込み用に設計されたスクリプト言語を使用します。たとえば、MVELは、質問のような単純な条件式を解析および評価できます。

MVELを使用すると、Java 1.6以降(特にJavaScript)でスクリプトエンジンを使用するよりも大きな利点が1つあります。MVELを使用すると、スクリプトをバイトコードにコンパイルできるため、実行時の評価がはるかに効率的になります。

于 2012-06-06T16:10:11.260 に答える
0

これはあなたの質問自体には答えません。同じ結果に影響を与える可能性のある代替ソリューションを提供します。

条件を定義する擬似コードを含む単一のデータベース列を格納する代わりに、スキーマが満たす必要のある条件のタイプとそれらの条件の値を定義するテーブルを作成します。これにより、これらの条件のプログラムによる評価が簡単になりますが、評価する条件の種類がさまざまである場合は、複雑になる可能性があります。

たとえば、次のようなテーブルがあるとします。

CONDITION_ID | MINIMUM | MAXIMUM | IS_PRIME  |   ETC.
______________________________________________________
      1      |    2    |   NULL  |   NULL    |   ...
      2      |    4    |    6    |   NULL    |   ...

これらの行エントリは、それぞれルールvalue > 2とにマップされます6 > value > 4

これにより、提供するアプローチに比べて多くのメリットが得られます。

  • パフォーマンスと清潔さの向上
  • 条件はデータベースレベルで評価でき、クエリのフィルタリングに使用できます
  • 擬似コード構文が壊れているシナリオの処理について心配する必要はありません
于 2012-06-06T16:10:55.217 に答える
-1

最新バージョンのjava(Java 7)では、文字列でSwitch Caseステートメントを使用できます。可能なバリエーションが多くない場合は、これまたは同様の方法で実行できます。

int value = getValue();
switch(myString) {
  case "value > 2" : if (value > 2) {  doSomething();} break;
  case "4 < value < 6" : if (value > 4 && value < 6) {  doSomethingElse();} break;
  default : doDefault();
}
于 2012-06-06T16:07:11.840 に答える
-4

Java 7を使用する以外にこれを行う非常に良い方法は、列挙型を使用することです。以下に示すように列挙型を宣言します

上記の列挙型には定数のコレクションがあり、その値はデータベースから返されると予想される文字列に設定されています。スイッチケースで列挙型を使用できるため、残りのコードが簡単になります

enum MyEnum
{
    val1("value < 4"),val2("4<value<6");
    private String value;

    private MyEnum(String value)
    {
        this.value = value;
    }
}


public static void chooseStrategy(MyEnum enumVal)
{   
    int value = getValue();
    switch(enumVal)
    {
        case val1:
        if(value > 2){}
        break;
        case val2:
        if(4 < value && value < 6) {}
        break;
        default:
    }
}

public static void main(String[] args)
{
    String str = "4<value<6";
    chooseStrategy(MyEnum.valueOf(str));
}

文字列をenum.valueofメソッドに渡すだけで、条件付き操作を実行するためにswitchcaseブロックに配置された適切な列挙型が返されます。上記のコードでは、この例で渡されるものの代わりに任意の文字列を渡すことができます

于 2012-06-06T17:17:02.200 に答える