如何统计枚举对象在对应类型数组中的出现次数,是否要用equals方法
枚举比较规则说明
Java 枚举的所有实例都是全局单例的,因此比较枚举值时,使用==和调用equals()效果完全相同,没有强制要求必须使用equals()。
- 补充细节:Enum 类重写的
equals()底层就是基于==实现,两种写法都合法。使用==还能避免调用方为 null 时触发的空指针异常,更推荐使用。
统计功能实现
首先你提供的枚举定义多写了一个多余的右大括号,修正后的正确定义如下:
enum Food { apples, oranges, grapes }
如果代码中提前静态导入了枚举值(import static 包名.Food.*),就可以直接写apples、grapes无需加类前缀。
实现方式1:普通遍历(兼容所有 Java 版本)
import java.util.HashMap; import java.util.Map; public class FoodCountDemo { public static void main(String[] args) { Food[] arr = {Food.apples, Food.apples, Food.grapes, Food.oranges, Food.apples}; Map<Food, Integer> countResult = new HashMap<>(); for (Food item : arr) { // 仅统计目标枚举值 if (item == Food.apples || item == Food.grapes) { countResult.put(item, countResult.getOrDefault(item, 0) + 1); } } // 输出结果 System.out.println("apples 出现次数:" + countResult.getOrDefault(Food.apples, 0)); System.out.println("grapes 出现次数:" + countResult.getOrDefault(Food.grapes, 0)); } }
运行输出:
apples 出现次数:3 grapes 出现次数:1
实现方式2:Stream 流实现(Java 8+ 可用,写法更简洁)
import java.util.Arrays; import java.util.Map; import java.util.stream.Collectors; public class FoodCountStreamDemo { public static void main(String[] args) { Food[] arr = {Food.apples, Food.apples, Food.grapes, Food.oranges, Food.apples}; Map<Food, Long> countResult = Arrays.stream(arr) .filter(item -> item == Food.apples || item == Food.grapes) .collect(Collectors.groupingBy(item -> item, Collectors.counting())); System.out.println("apples 出现次数:" + countResult.getOrDefault(Food.apples, 0L)); System.out.println("grapes 出现次数:" + countResult.getOrDefault(Food.grapes, 0L)); } }
运行结果和第一种实现完全一致。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

