2016-11-16 19 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

相关问题