Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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_Algorithm_Matching_String Matching_String Search - Fatal编程技术网

Java中的字符串搜索算法

Java中的字符串搜索算法,java,algorithm,matching,string-matching,string-search,Java,Algorithm,Matching,String Matching,String Search,我正在用大量数据进行字符串匹配 编辑:我正在将一个大列表中包含的单词与一些本体文本文件进行匹配。我从本体中获取每个文件,并搜索每个文件行的第三个字符串与列表中的任何单词之间的匹配 我犯了一个错误:我需要做的不是纯粹的匹配(结果很差),但我需要一些更松散的匹配函数,当字符串包含在另一个字符串中时,该函数也将返回结果 我做这件事的时候带着;这是非常快,工作很好,但现在我想我的工作是无用的,因为trie只返回精确匹配/ 执行此操作的算法类型是字符串搜索算法 有人能推荐一些他有经验的Java实现吗

我正在用大量数据进行字符串匹配

编辑:我正在将一个大列表中包含的单词与一些本体文本文件进行匹配。我从本体中获取每个文件,并搜索每个文件行的第三个字符串与列表中的任何单词之间的匹配

我犯了一个错误:我需要做的不是纯粹的匹配(结果很差),但我需要一些更松散的匹配函数,当字符串包含在另一个字符串中时,该函数也将返回结果

我做这件事的时候带着;这是非常快,工作很好,但现在我想我的工作是无用的,因为trie只返回精确匹配/

  • 执行此操作的算法类型是字符串搜索算法
  • 有人能推荐一些他有经验的Java实现吗
算法应该是快速的,但不是最优先的,它将与速度和复杂性相匹配

我非常感谢所有的建议/例子/解释/链接


谢谢大家!

我不完全确定我是否正确理解了这个问题,但听起来正则表达式可以解决这个问题


正则表达式绝对是您的最佳选择。它们的编写可能有点混乱,但它们是唯一一种可以进行更松散匹配的方法,而不需要一系列令人费解的if/else或switch语句

另外,它们会比替代品快得多。

您可能会发现它们很有用(它们在概念上与尝试类似)

对于每个字符串,您可以以“^”开头,以“$”结尾,并创建所有附加字符串的后缀树。空间使用率将为O(n),并且可能比trie的情况更糟

如果您现在需要搜索字符串s,您可以在O(| s |)时间内轻松完成,就像trie一样,您得到的匹配将是子字符串匹配(基本上,您将匹配某个字符串的某个后缀)

对不起,我手头没有Java实现的参考资料

找到了一个有用的答案:

其中:

这反过来又有:源代码:

您可以在文本文件中搜索单个模式,并对列表中的所有模式重复此算法


另一个最好的解决方案是使用多模式搜索算法,比如:

为什么不在java中使用indexOf方法呢。根据内存可用性,阅读内容。做一个索引,得到你需要的所有行。加载下一组内容

如果从文件中读取,请使用nio流

也许这个想法不好,但我相信java。它将使用最好的算法


使用正则表达式更好。

-1:为什么正则表达式是“最好的”?为什么选择if/else开关语句?在选择替代方案之前,你考虑过哪些其他选择?我想说regex的性能会很差!你必须编译它们,然后在匹配过程中可能进行回溯等等……好吧,问题最初的措辞(预编辑),这就是我阅读它的方式——显然,它不再适用了@白痴:我想这可能正是我所需要的,如果我理解得很好,我可以用同一棵树进行“匹配”和“包含”。@Julia:是的。如果要精确匹配,请在搜索字符串前加上“^”,再加上“$”并进行匹配。如果您想要包含,请按原样使用搜索字符串。@Moron:这似乎很完美。一定有一些java库@朱莉娅:看看我给这个答案添加的链接。什么是“做这件事的算法类型是字符串搜索算法?”问?您说在文本文件中搜索,但我不需要匹配文本文件中的任何位置,而是每行的第三个字符串,可以指定吗?(对于细节,我感到很抱歉,因为我匆忙地使用了基数trie)BM算法匹配任何字符串,而不考虑字符串的来源(来自文件中的文本,来自数据库中的单元格…等等)。