当前位置: 首页 > article >正文

27. 如何统计集合中每个元素的出现次数?请使用Map和Stream API举例说明。

在 Java 中,使用 MapStream API 可以轻松地统计集合中每个元素的出现次数。下面我将展示如何使用这两种方法来统计集合中元素的出现次数。

方法 1: 使用 Map 进行统计

可以使用 Map 手动迭代集合,并记录每个元素的出现次数。

import java.util.HashMap;
import java.util.List;
import java.util.Map;
​
public class ElementCountExample {
    public static void main(String[] args) {
        List<String> items = List.of("apple", "banana", "apple", "orange", "banana", "apple");
​
        Map<String, Integer> countMap = new HashMap<>();
​
        for (String item : items) {
            countMap.put(item, countMap.getOrDefault(item, 0) + 1);
        }
​
        System.out.println(countMap); // 输出: {orange=1, banana=2, apple=3}
    }
}

代码说明

  1. List.of(): 创建一个包含多个字符串的不可变列表。

  2. countMap.put(item, countMap.getOrDefault(item, 0) + 1): 遍历列表中的每个元素,并在 Map 中统计每个元素的出现次数。getOrDefault() 方法用于在键不存在时返回默认值 0,然后加 1

方法 2: 使用 Stream API 进行统计

使用 Java 8 的 Stream API 可以更加简洁地统计集合中每个元素的出现次数。

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
​
public class ElementCountStreamExample {
    public static void main(String[] args) {
        List<String> items = List.of("apple", "banana", "apple", "orange", "banana", "apple");
​
        Map<String, Long> countMap = items.stream()
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
​
        System.out.println(countMap); // 输出: {orange=1, banana=2, apple=3}
    }
}

代码说明

  1. items.stream(): 将集合转换为流(Stream)。

  2. Collectors.groupingBy(): 使用 groupingBy 按照元素分组。Function.identity() 作为分类函数,表示按元素本身分组。

  3. Collectors.counting(): 统计每个分组的数量。

  4. Map<String, Long> countMap: 最终结果是一个 Map,键为集合中的元素,值为该元素的出现次数。

总结

  • 使用 Map 统计:这是传统且简单的方法,适用于任何 Java 版本。它清晰且易于理解,适合需要更多控制和定制统计逻辑的场景。

  • 使用 Stream API 统计:这是一种更为简洁和函数式的写法,适用于 Java 8 及以上版本。Stream API 使代码更简洁,并且适合链式调用和复杂的数据处理。

这两种方法都能有效地统计集合中每个元素的出现次数,可以根据实际需求和个人喜好选择合适的方式。


http://www.kler.cn/a/287529.html

相关文章:

  • Vue模块化开发的理解
  • Spring Boot 接口防重复提交解决方案
  • JsonCpp
  • 【Fargo】23:采集时间转rtp时间
  • SQLite 和 MySQL语法区别
  • 定时器简介
  • Pinia 与 Vuex 对比
  • 【Nest 学习笔记】AOP切片编程
  • 页面滚动到指定位置——记录div滚动高度,并下次自动滚动到该位置
  • Java设计模式之单例模式详细讲解和案例示范
  • 华为云征文|Flexus X实例性能测评
  • 分贝通助力元气森林企业支出一体化降本提效
  • mysql 死锁 锁表的解决方法
  • Oracle高级sql语法学习之hits
  • vue按钮弹框
  • Leetcode Hot 100刷题记录 -Day3(双指针)
  • 【HTML】使用过程中的随记
  • C++入门8——vector的使用
  • 谷歌浏览器与edge哪个好用
  • 半导体芯闻--20240902
  • 百度广告联盟:抢占流量蓝海,精准营销新引擎
  • C#/.net core “hello”.IndexOf(“\0”,2)中的坑
  • 【香橙派系列教程】(十五) VSCode SSH远程连接开发板,以香橙派为例
  • uniapp壁纸项目笔记
  • vue后台项目打包成桌面应用程序(.exe)
  • 科大讯飞--C++开发--面经