我有一本语言词典(即英语、意大利语等...),它本质上是一个文件,每一行都有一个单词。
现在我想用一个方法创建一个类,该方法在输入中给定一个字符串,检查该字符串是否存在于该字典中。
我的想法是该方法返回一个布尔值。在伪代码中:
boolean checkWord(String s){
if(StringIsInDictionary) return true;
return false
}
实现该功能的最佳方式应该是什么?
考虑该文件将包含约 65000 个单词。
我有一本语言词典(即英语、意大利语等...),它本质上是一个文件,每一行都有一个单词。
现在我想用一个方法创建一个类,该方法在输入中给定一个字符串,检查该字符串是否存在于该字典中。
我的想法是该方法返回一个布尔值。在伪代码中:
boolean checkWord(String s){
if(StringIsInDictionary) return true;
return false
}
实现该功能的最佳方式应该是什么?
考虑该文件将包含约 65000 个单词。
将字典读成一个Set<String>
(例如,HashSet<String>
),然后使用set.contains(word)
.
对于空间和时间高效的解决方案(就像您可能在智能手机上使用的那样),请考虑使用布隆过滤器。这样您就不需要将字典存储在手机上,并且检查字符串是否在字典中会非常快。请注意,布隆过滤器可能会返回误报,但您可以对其进行调整以降低这种风险。
有几个开放源代码的布隆过滤器 Java 实现。一个在这里https://github.com/magnuss/java-bloomfilter。
您可能不想将单词存储为每行一个单词。更好的方法可能是只从磁盘读取文件一次,将单词存储在 HashSet(由 HashMap 支持的集合,搜索效率很高),然后使用set.contains("mystring")
. 但是,这将要求整个地图都在内存中,但是当您需要检查多个单词时它会非常有效。
然后,您甚至可以返回并以更有效的方式将集合序列化到磁盘,从而加快初始加载速度。
看看这个问题,我想它可以帮助你。 使用java在文本文件中查找字符串的最快方法