0

したがって、2 つの String 変数「name」と「value」を持つクラス A を考えてみましょう。

クラスBには、Aのセットである変数が含まれています

Set<A> allVariables 

こんな感じのセットです

A.name="$var1"
A.value = "x+10>2"

A.name="$var2"
A.value="11+y%10==0"

A.name="$var3"
A.value="$var1 && $var2"

私がする必要があるのは、これらの式を評価することです。これにはjexlを使用しています。Set を繰り返し処理し、これらの変数名をそれぞれの値に置き換える必要があります。

この場合、$var3 という名前のオブジェクトを "x+10>2 && 11+y%10==0" に置き換える必要があります。

どうすればいいですか?

4

2 に答える 2

2

2 つの Hashmap を作成しtranslatedtoTranslate.

Set を解析します。

セット内の各 A について、値を確認します。値に任意の数$element(符号で始まる) が含まれる場合、変換された Hashmap キー$でこれを探します。$element

そこにある場合は、の出現を$element翻訳されたハッシュマップで見つかった値に置き換えます。

$elementA オブジェクトで見つかったそれぞれについてこれを行います。

すべて$elementが翻訳されたら、オブジェクト A をtranslatedハッシュマップ (キー = 名前、値 = 値) に追加します。

toTranslateそれ以外の場合は、ハッシュマップに追加します。

すべての Set が解析されると、2 つのハッシュマップが得られます。

while ループを作成します:toTranslateハッシュマップが空でない間、各値を取得し、その$element中をハッシュマップ内のもので変換しようとしますtranslate

無限ループで終わる可能性があるので注意してください。良いことの 1 つは、ハッシュマップをループするたびにtoTranslate、その要素の数が減っていることを確認することです。そうでない場合は、無限ループに陥っています。

于 2013-03-21T09:42:32.757 に答える
0

再帰的である必要はないと思います。これだけでうまくいくと思います:

bool madeReplacement;

行う:

bool madeReplacement = false

セットの各メンバーについて、X:

セットの他のメンバーごとに、Y:

Y.name のすべてのインスタンスを X.value の Y.value に置き換えます。何かを置き換えた場合は、madeReplacement = true です。

while (madeReplacement)


例:

$var1 は値 1 です

$var2 は値 $var1 です

$var3 は値 $var2 + 2 です

$var3.value には $var2 が含まれています。$var2 を $var1 に置き換えます -> $var1 + 2

$var2.value には $var1 が含まれています。$var1 を 1 に置き換えます -> 1

$var3.value には $var1 が含まれます。$var1 を 1 に置き換えます -> 1 + 2

値に他の名前が含まれていないため、実行が終了しました。


「順不同で評価した」にもかかわらず、最終的には正しい答えが得られました。ただし、このアルゴリズムは最悪の場合 O(n^3) になる可能性があります (長いチェーンで互いに参照する n 個の変数があり、間違った端で置換を開始したと想像してください)。これを解決する 1 つの方法は、X.value に Y.name が含まれている場合、最初に Y.value を再帰的に評価することです (残りのセットに対して同じループを実行します)。これにより、最悪の場合は O(n^2) になるため、再帰的アプローチが適切であるというあなたの疑いは正しいかもしれません;)

(変数名が必ず$で始まるかどうかわからなかったので、気にしないように書きました)

于 2013-03-21T09:42:55.177 に答える