2013-03-02 165 views
3

我有一個語言字典(即英語,意大利語等),基本上是一個文件,每行有一個字。Java:檢查一個字符串是否在字典中

現在我想創建一個類,給出一個字符串輸入檢查該字符串是否存在該字典中的方法。

我的想法是該方法返回一個布爾值。僞代碼:

boolean checkWord(String s){ 
    if(StringIsInDictionary) return true; 
    return false 
} 

實現該功能的最佳方式是什麼?

請考慮文件將包含~65000個字。

+0

奧利其實我沒有試過任何東西。 – Ivan 2013-03-02 15:40:59

回答

7

將字典讀入Set<String>(例如,HashSet<String>),然後使用set.contains(word)

+0

並考慮使用帶'initialCapacity'參數的'HashSet'構造函數。 http://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html#HashSet(int) – 2013-03-02 15:34:32

+0

智能手機也有效嗎? – Ivan 2013-03-02 15:37:45

1

您可能不希望將這些單詞存儲爲每行一個單詞。一種更好的方法可能是從磁盤只讀取一次文件,將這些文件存儲在HashSet(由HashMap支持的一個集合中,這對搜索非常有效),然後使用set.contains("mystring")。但是,這將會要求整個地圖都在內存中,但是當您需要檢查多個單詞時,它會非常高效。

然後你甚至可以返回並以更高效的方式將磁盤序列化到磁盤,從而加快了初始加載速度。

2

對於空間和時間有限的解決方案(例如您可能會用在智能手機上),請考慮bloom filter。那麼你不需要在手機上存儲字典,並檢查字典中的字符串將非常快。請注意,布隆過濾器可能會返回誤報,但您可以調整它以降低此風險。

這裏有幾個開放源代碼的bloom過濾器實現。一個在這裏https://github.com/magnuss/java-bloomfilter

+0

+1,Bloom濾波器適用於內存和性能受到限制的情況。 – Joni 2013-03-02 17:25:12

相關問題