我有一个字符串数组
String[] words
和一个28000个单词的单词列表。我想检查字符串数组中的任何成员是否在单词列表中(单词列表在文本文件wordlist.txt中)。如何以最有效的方式完成此操作?String[] words
和一个28000个单词的单词列表。我想检查字符串数组中的任何成员是否在单词列表中(单词列表在文本文件wordlist.txt中)。如何以最有效的方式完成此操作?将字符串直接放入HashSet<String>
而不是数组中,并使用集合上的contains
方法迭代文件,以检查内容。您不会获得O(1)访问的提升。如果存在任何重复项,则这还将最小化用于存储Strings
的内存。
步骤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;
}
}
}
HashSet
的 add()
方法如果集合中已经存在该元素,则返回 false。
for (String str : words) {
if (!wordSet.add(str)) {
System.out.println("The word " + str + " is already contained.");
}
}
这比contains()
更复杂,也不那么底层。
contains
方法的HashSet<String>
或ArrayList<String>
。它将检查您的字符串是否已存储。HashSet
和ArrayList
之间的区别在于,hashset不允许重复值,并且它不会维护顺序,而arraylist允许您重复并且是有序集合。
但是,HashSet比arraylist更有效地执行搜索操作。HashSet
。HashSet<String> wordSet = new HashSet<String>(Arrays.asList(words));
检查在HashSet
中是否存在word
,使用HashSet.contains(Object o)方法,其中word
是您要检查是否存在的单词。
将原始的words.txt文件替换为序列化的HashSet。这应该是在运行应用程序之前的一个单独步骤。
然后,应用程序只需要加载一次哈希集合。
HashSet
可能更适合。 - kiheru