2017-03-09 65 views
2

我有這樣的功能:插入到包含HashMap的是HashMap,Java的

public void insert(String token, int docID) 
    { 
     insertNormIdx(token, docID); 
    } 

正在由主程序不斷調用。 docID是一個文檔的ID,token是我們在文檔中找到的一個詞。

所以這個函數被調用很多次,直到所有的文檔都被解析。我想要做的是創建一個包含一個條目docID的hashmap,這應該指向另一個包含我們在文檔中找到的單詞(令牌)的hashmap。

也就是說,如果我們在文檔(docID)'5'中找到10次單詞(標記)'the',我想要一個保存這些信息的結構,如:5,the,10。

這是我做了什麼,但它並沒有真正的工作,只保留第一個字從文件:

HashMap<Integer, HashMap<String, Integer>> normal_idx = new HashMap<Integer, HashMap<String, Integer>>(); 

    public void insertNormIdx(String token, int docID) 

    { 
     HashMap<String, Integer> val = new HashMap<String, Integer>(); 

     if(!normal_idx.containsKey(docID)) 
     { 

      val.put(token, 1); 
      normal_idx.put(docID, val); 
     } 

     if (normal_idx.containsKey(docID)) 
      { 

       if (normal_idx.get(docID).get(token)!=null) 
       { 
        val.put(token, normal_idx.get(docID).get(token)+1); 

        normal_idx.put(docID, val); 
       } 

      } 
    } 

回答

2

有一個在你的代碼有很多冗餘和錯誤的。在你的問題的具體問題是因爲沒有else這個if

if (normal_idx.get(docID).get(token)!=null) 

因此新的令牌從來沒有插入。

但整個代碼可以顯着提高。在Java 8中,您可以替換整個方法:

normal_idx.computeIfAbsent(docID, k -> new HashMap<>()) 
     .merge(token, 1, Integer::sum); 

如果你在較早的Java版本,你可以試試這個:

HashMap<String, Integer> val = normal_idx.get(docID); 
if (val == null) { 
    val = new HashMap<String, Integer>(); 
    normal_idx.put(docID, val); 
} 

Integer count = val.get(token); 
if (count == null) { 
    val.put(token, 1); 
} else { 
    val.put(token, count + 1); 
} 
+0

這個襯墊......腦海=吹,謝謝 –

1

更好的方式來做到這一點:

public void insertNormIdx(String token, int docID) { 
    Map<String, Integer> doc = normal_idx.get(docId); 
    if (doc == null) { 
     normal_idx.put(docId, doc = new HashMap<String, Integer>()); 
    } 
    Integer counter = doc.get(token); 
    if (counter == null) 
     doc.put(token, 1); 
    else 
     doc.put(token, ++counter); 
} 

順便說一下,不要只使用裸HashMap,創建類Document

1

您可以使用Java 8的computeIfAbsent方法把/合併值映射,例如:

public void insertNormIdx(String token, int docID) { 
    normal_idx.computeIfAbsent(docID, k -> new HashMap<>()).merge(token, 1, (old, one) -> old + one); 
}