所以考虑一个带有两个String变量“name”和“value”
的A类B类包含一个变量,即Set of 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&gt; 2&amp;&amp; 11 + y%10 == 0”
我该怎么做?
答案 0 :(得分:2)
您创建了2个Hashmap,translated
和toTranslate
。
你解析你的集。
对于套装中的每个A,你要看价值。如果值包含任意数量的$element
(由$
符号开头),则会在已翻译的Hashmap键中查找此$element
。
如果它在那里,你可以用你翻译的hashmap中找到的值替换$element
的出现次数。
您为A对象中找到的每个$element
执行此操作。
如果已翻译了所有$element
,则将对象A添加到translated
hashmap(key = name,value = value)。
否则,您将其添加到toTranslate
散列图。
解析完所有Set后,您就会得到2个哈希图。
您创建了一个while循环:虽然toTranslate
hashmap不为空,但您获取每个值,并尝试使用$element
hashmap中的translate
内的toTranslate
进行翻译。 / p>
小心,你可能会以无限循环结束。要做的一件好事是确保每次循环{{1}}散列图时,其元素的数量都会减少。如果不是,你处于无限循环中。
答案 1 :(得分:0)
我认为它不需要递归。我认为这样可行:
bool madeReplacement;
做的:
bool madeReplacement = false
对于集合中的每个成员,X:
对于该组的每个其他成员,Y:
用X.value中的Y.value替换Y.name的所有实例。如果你替换了任何东西,makeReplacement = true。
while(madeReplacement)
示例:
$ var1是值1
$ var2是值$ var1
$ var3是值$ var2 + 2
$ var3.value包含$ var2,用$ var1替换$ var2 - &gt; $ var1 + 2
$ var2.value包含$ var1,将$ var1替换为1 - &gt; 1
$ var3.value包含$ var1,将$ var1替换为1 - &gt; 1 + 2
没有任何值包含任何其他名称,执行完毕。
即使我们已经无序评估了&#39;无论如何,我们最终得到了正确的答案。但是,在最坏的情况下,这个算法可能是O(n ^ 3)(想象一下,如果你有一个长链中互相引用的n个变量,并且你在错误的一端开始替换)。解决这个问题的一种方法是,当X.value包含Y.name时,首先递归地计算Y.value(通过执行相同的循环遍历该集合)。这使得O(n ^ 2)最坏的情况,所以你怀疑递归方法是否合适可能是正确的;)
(我不确定变量名是否保证以$开头,所以我写了它就没关系了)