如何基于对象属性的最常见值过滤Java中的ArrayList对象列表
没问题,我来帮你搞定这个需求!你想要的是筛选出列表中某个属性出现频次最高的所有对象对吧?结合你给的代码示例,我假设你的Data类包含name字符串属性和num整数属性,咱们就以num属性为例来实现,思路非常清晰,分三步就能完成:
实现思路与代码
1. 先定义完整的Data类
首先得确保你的Data类有对应的构造方法、Getter方法,方便后续操作:
class Data { private String name; private int num; public Data(String name, int num) { this.name = name; this.num = num; } // 重写toString方便打印结果 @Override public String toString() { return "Data{name='" + name + "', num=" + num + "}"; } // 获取num属性的Getter方法 public int getNum() { return num; } // 如果需要基于name筛选,再加一个getName方法即可 public String getName() { return name; } }
2. 核心筛选逻辑实现
咱们写一个专门的方法来处理筛选,步骤拆解如下:
- 第一步:用
HashMap统计每个属性值的出现频次 - 第二步:找出频次最高的那个数值
- 第三步:遍历原列表,把属性值对应频次等于最高频次的对象筛选出来
完整代码如下:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { ArrayList<Data> list = new ArrayList<>(); list.add(new Data("Uvumvew", 10)); list.add(new Data("Uvumvew", 10)); list.add(new Data("Uvumvew", 10)); list.add(new Data("Uvumvew", 11)); list.add(new Data("Uvumvew", 14)); list.add(new Data("Uvumvew", 14)); // 调用筛选方法,得到结果 List<Data> filteredList = filterByMostFrequentAttribute(list); // 打印筛选后的对象 filteredList.forEach(System.out::println); } private static List<Data> filterByMostFrequentAttribute(List<Data> dataList) { // 处理空列表的边界情况 if (dataList.isEmpty()) { return new ArrayList<>(); } // 1. 统计每个num值的出现频次 Map<Integer, Integer> frequencyMap = new HashMap<>(); for (Data data : dataList) { int num = data.getNum(); // 用getOrDefault简化计数逻辑 frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1); } // 2. 找出最高频次 int maxFrequency = frequencyMap.values().stream() .max(Integer::compareTo) .orElse(0); // 3. 筛选出符合条件的对象 return dataList.stream() .filter(data -> frequencyMap.get(data.getNum()) == maxFrequency) .collect(Collectors.toList()); } }
3. 灵活调整适配不同属性
如果你想基于name属性来筛选,只需要修改几处代码:
- 把
Map<Integer, Integer>改成Map<String, Integer> - 把
data.getNum()换成data.getName() - 对应的泛型和变量名也可以跟着调整,非常灵活
另外,如果有多个属性值的频次相同且都是最高(比如假设10和14都出现3次),这个逻辑会把所有对应属性值的对象都保留下来,完全符合需求。
内容的提问来源于stack exchange,提问作者SmileyHuehue
相关产品推荐
相关产品推荐

