2017-07-28 74 views
0

我正在构建一个自动翻译Java中布尔查询的小应用程序。Java:在替换循环中的字符串时出现问题

这是查找查询字符串是否包含某个单词的代码,如果是,则用替换后的值与翻译后的值进行比较。

int howmanytimes = originalValues.size(); 

for (int y = 0; y < howmanytimes; y++) { 
    String originalWord = originalValues.get(y); 
    System.out.println("original Word = " + originalWord); 

    if (toReplace.contains(" " + originalWord.toLowerCase() + " ") 
     || toCheck.contains('"' + originalWord.toLowerCase() + '"')) { 
     toReplace = toReplace.replace(originalWord, translatedValues.get(y).toLowerCase()); 
     System.out.println("replaced " + originalWord + " with " + translatedValues.get(y).toLowerCase()); 
    } 

    System.out.println("to Replace inside loop " + toReplace); 
} 

问题是,当一个查询有,例如,“(mykeyword OR‘蓝色mykeyword’)”和转换后的值是不同的,例如,mykeyword 转化为 elpalavra和“蓝mykeyword” 翻译为“elpalavra azul”。在这种情况下会发生什么情况是,当它应该是'(elpalavra OR“elpalavra azul”)'时,结果字符串将是'(elpalavra OR“蓝色elpalavra”)'。我明白,在第一个循环中,它会替换所有关键字,并在第二个循环中不再包含它应该翻译的原始值。 我该如何解决这个问题?

谢谢

+0

一种方法是将其全部分割成一个数组,然后循环遍历数组,如果找到关键字,则转换它,否则跳过它。 –

+0

为什么在形成查询之后而不是之前做翻译? –

+0

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/text/StrSubstitutor.html可能是一个很好的方法来做到这一点 – 2017-07-28 11:31:00

回答

1

您可以按size desc对originalValues进行排序。之后通过它们循环。 这样你首先替换“蓝色mykeyword”,并且只有在你替换“mykeyword”之后

0

“toCheck”变量没有被解释为什么,在任何情况下它的使用方式看起来都很奇怪(对我来说至少对我来说)。的是,除了,为了回答你的要求的一种方式可以此(仅基于您指定的要求)

饲养:

  1. 排序您originalValues,让更多的话的人是第一次。那些词数相同的词应该从更多的长度开始排序。