我有一个字符串数组String[] words
和一个28000字的单词列表。
我想检查String数组的任何成员是否在WordList中(单词列表在文本文件wordlist.txt中)
最有效的方法是什么?
答案 0 :(得分:9)
将字符串直接放入HashSet<String>
而不是数组中,然后使用集合上的contains
遍历文件以检查内容。你不会改进O(1)访问。如果存在任何重复项,这也将最小化用于存储Strings
的内存。
答案 1 :(得分:2)
您可以尝试使用数组(树)后缀算法,但需要实现,请看:
答案 2 :(得分:1)
步骤1:不要使用字符串数组。而不是使用HashSet。
步骤2:将文件(即wordlist.txt)内容加载到另一个HashSet
中第3步:
Set<String> set1 = new HashSet<String>(); //Load the string array into set
Set<String> set2 = new HashSet<String>(); //load the file contents into set
for (String str : set1) {
for (String str2 : set2) {
if (str.equalsIgnoreCase(str2)) {
break;
}
}
}
答案 3 :(得分:0)
您可以使用HashSet<String>
或具有ArrayList<String>
方法的contains
。它会检查你的字符串是否存储。
HashSet
和ArrayList
之间的区别是hashset不允许重复值,并且它不会维护顺序,而arraylist允许您复制及其有序集合。
但是HashSet比arraylist更有效地执行搜索操作。
答案 4 :(得分:0)
创建HashSet
字符串为
HashSet<String> wordSet = new HashSet<String>(Arrays.asList(words));
使用HashSet.contains(Object o)方法检查word
中的HashSet
,其中word
是您要检查的单词是否存在。
答案 5 :(得分:0)
存储而不是原始的words.txt序列化的HashSet。作为运行应用程序的单独步骤。
然后,应用程序只需要加载一次哈希集。
答案 6 :(得分:0)
HashSet
的{{1}}如果该字词已经出现在该集合中,则返回false。
add()
这比for (String str : words) {
if (!wordSet.add(str)) {
System.out.println("The word " + str + " is already contained.");
}
}
更复杂,更低级别。
答案 7 :(得分:0)
如果您的单词列表可以适合内存,则HashSet就足够了。
如果关注内存大小,请使用BloomFilter。虽然布隆过滤器可能会给出错误的答案,但您可以调整它发生的概率。