2016-11-16 18 views
-1

所以我已經完成了一個程序,並有幫助建立它/與另一個人一起工作。我瞭解每一行代碼除了一部分以外的所有程序。這是代碼:這段代碼的功能不完全清楚嗎? (包括Set,HashMap和.keySet())

Set<String> set1 = firstWordGroup.getWordCountsMap().keySet(); 
     Map<String, Integer> stringIntegerMap1 = set1.stream().collect(HashMap::new, 
    (hashMap, s) -> hashMap.put(s, s.length()), HashMap::putAll); 

stringIntegerMap1.forEach((key,value) ->System.out.println(key + " : "+value)); 

一些背景資料:

  • getWordCut是看起來像這樣的方法:)

    公衆的HashMap getWordCountsMap({

    HashMap<String, Integer> myHashMap = new HashMap<String, Integer>(); 
    
        for (String word : this.getWordArray()) { 
         if (myHashMap.keySet().contains(word)) { 
          myHashMap.put(word, myHashMap.get(word) + 1); 
         } else { 
          myHashMap.put(word, 1); 
         } 
    
        } 
    
        return myHashMap; 
    } 
    
  • firstWordGroup是一個存儲一串單詞的構造函數。

如果有人能夠準確解釋這段代碼的作用以及它是如何做的,那麼這將是有益的,謝謝。 P:我不知道是否提供整個程序來重現代碼是相關的,所以如果你認爲是這樣的話,只需留下評論,然後我將編輯問題以便重現該程序。

回答

0
Set<String> set1 = firstWordGroup.getWordCountsMap().keySet(); 

此行調用getWordCountsMap,它從單詞返回一個映射到它們的計數。然後,它忽略了計數,只是在一個集合中的文字。請注意,這可以通過許多更簡單的方法來實現。

Map<String, Integer> stringIntegerMap1 = set1.stream() 
    .collect(HashMap::new, (hashMap, s) -> hashMap.put(s, s.length()), HashMap::putAll); 

這將單詞集合轉換爲流,然後收集流。收集器首先創建一個哈希映射,然後爲每個單詞添加一個從其長度的映射。如果創建了多個地圖(如在流中允許的那樣),那麼它們使用putAll進行組合。再次,有更簡單和更清晰的方法來實現這一點。

stringIntegerMap1.forEach((key,value) ->System.out.println(key + " : "+value)); 

此行遍歷地圖中的所有條目並打印出鍵和值。

所有這些代碼可能已與實現:

Arrays.stream(getWordArray()) 
    .distinct().map(w -> w + ":" + w.length()).forEach(System.out::println); 

此命令的話轉換成流,刪除重複的單詞映射到那麼輸出字符串打印它們。

1

getWordsCountsMap()返回一個地圖,其中所述鍵是一個字,值是多少次發生在陣列中的字

Set<String> set1 = firstWordGroup.getWordCountsMap().keySet(); 

.keyset()方法只返回鍵的地圖,所以現在你有一組單詞,但已經失去了發生次數。

Map<String, Integer> stringIntegerMap1 = 
    set1.stream() 
     .collect(HashMap::new, 
       (hashMap, s) -> hashMap.put(s, s.length()), 
       HashMap::putAll) 

這是使用Java8流通過集(字)迭代最初投入的地圖,並創建一個新的哈希表,其中的關鍵是單詞(因爲它以前)和值長度(但最初它是字數)。新的哈希映射被創建並填充並返回。

我不理解的是最終的HashMap :: putAll(),它似乎只需要填充hashmap並重新添加所有條目(因爲鍵將被替換,這實際上是不可操作的) 。由於我沒有打開我的IDE來放置代碼並對其進行測試(如果你不是自己,會推薦,我只是沒有興趣去做,因爲這不是我的問題!)。

stringIntegerMap1.forEach((key,value) ->System.out.println(key + " : "+value)); 

在本質上,這是通過在創建的映射中的條目進行迭代,打印出用於每個字和長度的清潔方式。

經過這樣的思考,我有一種感覺,我正在爲你做你的功課,真正的解決方法是打破一切,通過你的IDE進行調試,看看每一步方式是。

+0

我在我的答案中解釋了'putAll'。收集器旨在允許單獨的執行線程收集不同的元素,然後將它們合併。 putAll是將結果結合在一起的方法。正在合併的地圖將具有不同的元素,因此將所有元素從一個元素轉換爲另一個元素正在有效地合併它們。 – sprinter

+0

感謝您的解釋,我認爲我們大約在同一時間按下提交按鈕,因爲兩個響應一起踢起來1謝謝。 –

+0

是的,我懷疑我們都看到了每個人的答案,並想知道:-) – sprinter

相關問題