2011-04-06 156 views
0

您好我正在用dictionary.txt文件填充一個哈希映射,我將哈希映射分成多組字長。搜索一個哈希映射

我無法搜索哈希圖的模式「a * d ** k」;

任何人都可以幫助我嗎?

我需要知道如何搜索Hashmap?

我真的很感激,如果你能幫助我。 謝謝。

+0

你將不得不寫產生設置內容爲一個字符串的函數 - 在「的toString()」方法將無法做到這一點。 – Pointy 2011-04-06 14:01:20

+0

我使用這種方法從集合中獲取單個字符串,但它只給出第一個字符串。'公共靜態字符串getSingleString(集S) \t { \t \t \t 而\t { \t \t \t串m = s.iterator()的next()的toString()(s.isEmpty()!)。; \t \t \t return m; \t \t \t \t \t \t \t \t} \t \t返回NULL; \t \t \t}' – 2011-04-06 15:25:51

+0

那麼,該函數肯定只會返回第一個字符串。你設置while循環,它獲得Set的第一個元素並立即返回它。 – Pointy 2011-04-06 15:28:40

回答

4

A HashMap僅僅是模式搜索的錯誤數據結構。

你應該考慮這樣做的特徵模式搜索開箱即用的技術,如Lucene


而且在回答此評論:用它爲Android

1m,並其 最快的搜索方式

HashMaps非常快,這是真的,但只有當您按照預期使用它們時纔是如此。在你的場景中,散列碼並不重要,因爲你知道所有的鍵都是數字的,你可能不會有比30個字母更長的單詞。

那麼,爲什麼不直接使用集合的Array或ArrayList來代替HashMap,而是用list.get(string.length()-1)array[string.length()-1]來代替map.get(string.length())。我敢打賭,性能會比使用HashMap更好(但我們無法分辨出這些差別,除非您擁有舊的機器或者條目)。

我並不是說我的設計使用List或Array更好,但是您使用的數據結構僅用於不適用的目的。


嚴重:如何寫作對你的話到平面文件(每行一個詞,由詞長排序,然後是按字母順序),只是運行在該文件中的正則表達式查詢?如果文件太大,請對文件進行流式處理並搜索各個行,或者將它作爲字符串讀取,並在IO速度太慢時將其保存在內存中。


或者怎麼樣只用一個自定義Comparator一個TreeSet

示例代碼:

public class PatternSearch{ 

    enum StringComparator implements Comparator<String>{ 
     LENGTH_THEN_ALPHA{ 

      @Override 
      public int compare(final String first, final String second){ 

       // compare lengths 
       int result = 
        Integer.valueOf(first.length()).compareTo(
         Integer.valueOf(second.length())); 
       // and if they are the same, compare contents 
       if(result == 0){ 
        result = first.compareTo(second); 
       } 

       return result; 
      } 
     } 
    } 

    private final SortedSet<String> data = 
     new TreeSet<String>(StringComparator.LENGTH_THEN_ALPHA); 

    public boolean addWord(final String word){ 
     return data.add(word.toLowerCase()); 
    } 

    public Set<String> findByPattern(final String patternString){ 
     final Pattern pattern = 
      Pattern.compile(patternString.toLowerCase().replace('*', '.')); 
     final Set<String> results = new TreeSet<String>(); 
     for(final String word : data.subSet(
      // this should probably be optimized :-) 
      patternString.replaceAll(".", "a"), 
      patternString.replaceAll(".", "z"))){ 
      if(pattern.matcher(word).matches()){ 
       results.add(word); 
      } 
     } 
     return results; 
    } 

} 
+0

我需要在代碼中使用哈希映射。 – 2011-04-06 15:22:56

+0

@Steven爲什麼?這是作業嗎? – 2011-04-06 15:53:45

+0

我使用它爲Android,它是最快的搜索方式。 – 2011-04-06 19:42:17