Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 优化搜索两个字符串中的关键字_Java_Regex_Algorithm_Semantics_Semantic Analysis - Fatal编程技术网

Java 优化搜索两个字符串中的关键字

Java 优化搜索两个字符串中的关键字,java,regex,algorithm,semantics,semantic-analysis,Java,Regex,Algorithm,Semantics,Semantic Analysis,我有两个字符串,我正在检查这两个字符串中的特定常用词。我已经有了语义分数;在这种情况下不相关,因为这些词是技术缩略语,具有特殊的强调。他们的常用词越多,分数越高,越接近 有很多方法可以做到这一点。到目前为止,我已经想到了两个 1) 我用字符串中的单词创建了两个ArrayList。如果ArrayList和ArrayList中都存在单词,我必须搜索另一组单词。如果他们这样做,我给他们加1分 然后我可以有多种条件,比如 if((firstString.contains(keyWord)) &

我有两个字符串,我正在检查这两个字符串中的特定常用词。我已经有了语义分数;在这种情况下不相关,因为这些词是技术缩略语,具有特殊的强调。他们的常用词越多,分数越高,越接近

有很多方法可以做到这一点。到目前为止,我已经想到了两个

1) 我用字符串中的单词创建了两个ArrayList。如果ArrayList和ArrayList中都存在单词,我必须搜索另一组单词。如果他们这样做,我给他们加1分

然后我可以有多种条件,比如

 if((firstString.contains(keyWord)) && (secondString.contains(keyWord)))
  then +1
 if((firstString.contains(anotherKeyWord)) && (secondString.contains(anotherKeyWord)))
  then +1
2> 获取两个字符串,并使用

if firstString.("(.*)someExpression(.*)")) && secondString.("(.*)someExpression(.*)"))
then +1
if firstString.("(.*)someOtherExpression(.*)")) && secondString.("(.*)someOtherExpression(.*)"))
then +1
还有其他更好的方法吗?我现在更倾向于使用正则表达式。这样做看起来相当有效

基本上,我正在做的是,我试图通过使用缩写词,如“ACLS”、“ASHD”、“CXR”(常见医学术语),对类似的句子进行分组,因为我知道这些句子主要讨论这些问题。然后,我得到语义分数,对那些包含这些单词的句子进行分组。错误的方法:/


谢谢:)

如果只有几个单词需要检查,我会坚持使用
String.contains()
,因为它可读且易于实现


如果有很多单词需要检查,字符串搜索算法会很方便。

这实际上取决于您希望算法的效率。如果要从您当前建议的两种不同方法中进行选择,我将使用一个简单的
contains()
检查。正则表达式很适合匹配有变化的模式。对于你这里的比赛场景来说,他们是过度杀伤力了。在最好的情况下,编译所有不同的正则表达式所需的时间将使它们比简单的
contains()
方法慢


然而,有更快的方法。例如,您可以将每个字符串拆分为其包含的单词,并将它们添加到哈希集(基本上是一个实现为哈希表的集)。然后,您将使用hashset的intersect操作(最坏情况是O(n))来获取公共字。这也是一个哈希集。然后检查这些常用词是否可以在已知词列表中找到(也可以是哈希表),并增加分数。使用这种方法,您将跳过所建议方法的所有字符串匹配。

尽管我在这里几乎不关心空间复杂性,但创建这些额外的数据结构(ArrayList和string[])是否会更加低效?我不太关心容易实现。我会想办法的;)谢谢:)我来看看算法。谢谢:)我试试这个!我可以用Arraylist而不是hashtable来存储包含的单词吗?我不明白为什么我需要在这里配对。我的思路是:Collection firstString=new ArrayList();加上(*);另一个字符串也是如此。然后使用firstString.retainAll(secondString)。。。这不是最理想的吗?@awesomeniket你绝对不必这么做,但它也不是最理想的。我之所以提出hashset,是因为hashset上的retainAll或intersect操作的顺序是O(n),而不是O(n^2)。然而,如果您的字符串包含的单词不超过平均20个,那么这两种方法就不会有什么不同。请随意使用更熟悉的方法,但要记住另一种更复杂的方法。我没想到这会是O(n^2):p的顺序。。我将使用hashset。再次感谢你!:)我还有一个问题。Hashmap如果值是单词,那么键将是什么。