如何递归替换数组中字符串的出现次数

时间:2013-03-21 09:29:48

标签: java recursion jexl

所以考虑一个带有两个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”

我该怎么做?

2 个答案:

答案 0 :(得分:2)

您创建了2个Hashmap,translatedtoTranslate

你解析你的集。

对于套装中的每个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)最坏的情况,所以你怀疑递归方法是否合适可能是正确的;)

(我不确定变量名是否保证以$开头,所以我写了它就没关系了)