[英]Java: Most efficient way to check if a String is in a wordlist
我有一個字符串String[] words
和一個28000字的單詞列表。
我想檢查String數組的任何成員是否在WordList中(單詞列表在文本文件wordlist.txt中)
什么是最有效的方法?
將字符串直接放入HashSet<String>
而不是數組,並使用集合上的contains
迭代文件以檢查內容。 你不會改進O(1)訪問。 如果存在任何重復項,這也將最大限度地減少用於存儲Strings
內存。
您可以嘗試使用數組(樹)后綴算法,但需要實現,看看:
第1步:不要使用字符串數組。 而不是使用HashSet。
步驟2:將文件(即wordlist.txt)內容加載到另一個HashSet中
第三步:
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;
}
}
}
您可以使用contains
方法的HashSet<String>
或ArrayList<String>
。 它將檢查您的String是否存儲。
HashSet
和ArrayList
之間的區別是hashset不允許重復值,並且它不會維護順序,而arraylist允許您復制及其有序集合。 但是HashSet比arraylist更有效地執行搜索操作。
創建一個字符串的HashSet
作為
HashSet<String> wordSet = new HashSet<String>(Arrays.asList(words));
並使用HashSet.contains(Object o)方法檢查HashSet
中的word
,其中word
是您要檢查的單詞(如果存在)。
存儲而不是原始的words.txt序列化的HashSet。 作為運行應用程序的單獨步驟。
然后,應用程序只需加載一次哈希集。
如果該單詞已經存在於集合中,則HashSet
的add()
將返回false。
for (String str : words) {
if (!wordSet.add(str)) {
System.out.println("The word " + str + " is already contained.");
}
}
這比contains()
更復雜,更低級。
如果您的單詞列表可以適合內存,則HashSet就足夠了。
如果關注內存大小,請使用BloomFilter 。 雖然布隆過濾器可能會給出錯誤的答案,但您可以調整它發生的概率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.