作为前言,我对Java非常陌生,对HashMaps也非常陌生.

我有一个HashMap,它以字符串作为键,并关联表示频率的整数值.我想知道找到与最大整数value相关联的keymost efficient方法.

以下是我到目前为止拥有的代码:

public String most(String[] sentences) {

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

    for(String sentence : sentences) {
        String[] words = sentence.split(" ");
        for (String word : words) {
            wordFreq.merge(word, 1, Integer::sum);
        }
    }
    
    //TODO find key associated with max integer value in map
}

推荐答案

你可以这样做.流entrySet,然后通过对条目的值使用maxBy来获得最大条目.因为maxBy返回Optional,所以您可以使用map来获取该值.如果不存在值,则返回提示性消息.

 String result  = wordFreq.entrySet().stream()
        .collect(Collectors.maxBy(Entry.comparingByValue()))
                .map(Entry::getKey).orElse("No Value Found");

正如 comments 所说,你也可以做到这一点.出于习惯,我倾向于使用第一个词.

String result = wordFreq.entrySet().stream()         
    .max(Entry.comparingByValue())
    .map(Entry::getKey).orElse("No Value Found");

您也可以使用其他方法来优化这一点,但因为您构建了一张 map ,所以我认为这就是您想要的方式. 如果您需要单词映射,您可能希望在方法之外构造它.然后,只需将映射传递给方法,而不是一组语句.这样你就可以把 map 用在其他地方了.

既然你还没有机会回答我的问题,我将提供一个关于领带的解决方案,使一个词出现的次数最多.与前面类似,只是首先返回找到的最大值.您可以对entrySet进行流式处理,筛选出具有最大值的条目.然后收集成一份 list .


int max = wordFreq.entrySet().stream()           
    .max(Entry.comparingByValue()).map(Entry::getValue)
            .orElse(0);
    
List<String> wordFreq.entrySet().stream()
            .filter(e -> e.getValue() == max).map(Entry::getKey)
            .toList();
    
}

最后,使用流构造来创建初始频率图.我使用\\s+作为正则表达式,因为可能有多个空格.splitAsStream将应用该图案,而toMap在功能上类似于merge.

Map<String, Integer> wordFreq = Arrays.stream(sentences)
                .flatMap(s -> Pattern.compile("\\s+").splitAsStream(s))
                .collect(Collectors.toMap(x -> x, x -> 1,
                        Integer::sum));
            

Java相关问答推荐

Java Android OnKeyspel事件未触发

RDX触发ChoiceBox转换器(并按字符串值排序)

我可以在regex中的字符类中放置断言吗?

如何在Javascript中设置文本区域圆角的样式

将数组整体转换为链接表

Jlink选项&-strie-ative-Commands";的作用是什么?

使用@MappdSuperClass扩展ParentClass&Won t继承ParentClass属性

在AVL树的Remove方法中使用NoSuchElementException时遇到问题

为什么使用JDK21获取锁定锁比使用JDK11慢

Com.google.firebase.database.DatabaseException:无法将类型为java.lang.Boolean的值转换为字符串.这是关于什么的?

SonarLint:只能有条件地调用方法(S)

Docker不支持弹性APM服务器

在Eclipse中调试未导出的JDK模块的Java包

将JSON字符串转换为Java类

循环不起作用只有第一个元素重复

Java System.getProperty在哪里检索user.home?

Bash数组的单引号元素并使用空格连接

如何正确使用java.time类?

原始和参数化之间的差异调用orElseGet时可选(供应商)

转换为JSON字符串时,日期按天递减-Java