有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java不完全清楚这段代码的作用是什么?(包括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是一个存储字符串的构造函数

如果有人能准确地解释这段代码的作用以及它是如何实现的,那将非常有用,谢谢

附言:我不确定是否提供整个程序来复制代码是相关的,所以如果你认为是相关的,就留下一条评论说是这样,我会编辑这个问题,这样你就可以复制程序


共 (2) 个答案

  1. # 1 楼答案

    getWordScontsMap()返回一个映射,其中关键字是一个单词,值是该单词在数组中出现的次数

    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 streams来迭代最初放入映射中的集合(单词),并创建一个新的哈希映射,其中键是单词(与以前一样),值是单词的长度(而最初是单词计数)。创建并填充并返回一个新的哈希映射

    我不理解的是最终的HashMap::putAll(),它似乎接受了刚刚填充的HashMap并重新添加了所有条目(这实际上是一个no-op,因为键将被替换)。因为我还没有快速打开IDE来放入代码并测试它(如果你自己没有,我会推荐这样做,因为这不是我的问题!)

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

    本质上,这是一种更干净的方法,可以遍历创建的映射中的条目,打印出每个条目的单词和长度

    在完成这项工作并思考之后,我有一种感觉,我正在为您做功课,解决这一问题的真正方法是通过IDE进行分解和调试,并查看每一步的功能

  2. # 2 楼答案

    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);
    

    此命令将单词转换为流,删除重复项,将单词映射到输出字符串,然后打印它们