当前位置: 首页 > 知识库问答 >
问题:

使用流在最大出现次数列表中查找键

拓拔德馨
2023-03-14

我们有一个列表:

List<String> strList = Arrays.asList("10.0 string1", "10.3 string2", "10.0 string3", "10.4 string4","10.3 string5");

每个条目是一个由两个字符串组成的字符串,由空格分隔。目标是找到出现次数最多的所有条目(即10.0和10.3,共出现2次)。

下面的代码有效。问题是,这3条语句是否可以减少到1条或至少2条?

var map2 = strList.stream()
                  .map(m -> {String[] parts = m.split(" "); return parts[0];})
                  .collect((Collectors.groupingBy(Function.identity(),LinkedHashMap::new, Collectors.counting())));

var max3 = map2.entrySet().stream()
               .max((entry1, entry2) -> entry1.getValue() > entry2.getValue() ? 1 : -1) 
               .get() 
               .getValue();

var listOfMax2 = map2.entrySet().stream()
                     .filter(entry -> entry.getValue() == max3)
                     .map(Map.Entry::getKey)
                     .collect(Collectors.toList());

System.out.println(listOfMax2);

共有2个答案

吴高畅
2023-03-14
strList
    .stream()
    .map(s -> s.substring(0, s.indexOf(" ")))
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
    .entrySet()
    .stream()
    .collect(Collectors.groupingBy(Entry::getValue))
    .entrySet()
    .stream()
    .max(Entry.comparingByKey())
    .ifPresent(opt -> System.out.println(opt.getValue()));

相当直接的:

    < li >使用< code>Stream#map获取密钥。 < li >使用< code > Collectors # grouping by 以< code >映射的形式获取键的频率。 < li >将所有相同的频率组合在一起。 < li >获取< code>Stream#max频率并在< code>O(n)时间内打印< code >列表
乌俊健
2023-03-14

如果您将变量的名称更改为有意义的内容,那么您的代码非常简单。您可以编写一个自定义收集器,但我怀疑它是否值得努力,是否能够使代码更具可读性。我能想到的最简单的解决方案是,如果您坚持链接流,首先构建频率,然后反转映射,将值(频率)用作键,将键用作值,然后收集到树映射,该树映射按键排序,并获得最后一个条目:

List<String> strList = Arrays.asList("10.0 string1", "10.3 string2", "10.0 string3", "10.4 string4", "10.3 string5");

var mostFrequentEntries =
        strList.stream()
               .map(s -> s.substring(0, s.indexOf(' ')))
               .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
               .entrySet()
               .stream()
               .collect(Collectors.groupingBy(Map.Entry::getValue, TreeMap::new, Collectors.mapping(Map.Entry::getKey, Collectors.toList())))
               .lastEntry().getValue();

System.out.println(mostFrequentEntries);
 类似资料:
  • 问题内容: 假设我有一个包含以下值的表。 所以我想构造以下输出。 它仅获取列中每个元素的计数。 我在列出唯一列时遇到了问题。 谁能告诉我该怎么做? 我已经弄乱了和,但是无法获取左侧的值列表。 问题答案: 你是这个意思吗

  • 假设我有一个数组 查找出现次数最多的项的最有效和“pythonic”方法是什么?它在列表中出现了多少次?

  • 我知道回溯会有所帮助,但如何呢?

  • 问题内容: 我有两个清单如下 和 我试图找出在每个列表中出现最多的值。这就是我尝试过的。 我已经走了这么远,但我想不出如何在删除列表中的所有值之前停止的方法。 问题答案: 如果要查找列表中每个元素的出现,可以使用from的模块:- 因此,前两个元素在您的列表中最常见。 或者,您还传递参数来指定所需的元素数:- 更新:- 您也可以先找出计数,然后再找到具有该值的元素总数,然后可以将其用作参数:-

  • 我正在尝试编写一个方法,该方法可以在列表列表中找到对象的索引并利用并行性。这是我的代码。 当我运行以下代码时 输出类似于 换句话说,即使在找到对象之后,搜索仍在继续。不应该是短路操作吗?我错过了什么?此外,在迭代列表或锯齿数组时,利用并行性的最佳方法是什么? 编辑 按照@Sotirios回答中的想法,我得到了以下输出 请注意 即使找到答案也继续搜索。

  • 我正在尝试在字符串列表中获得最大数字。 我的代码是: 上述代码给出了一个错误。错误是:不可编译的源代码-错误的sym类型:Java . util . stream . stream . maptoint . max .结果我应该得到< code>1125。我尝试了不同的方法,但是没有一种有效。