You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于对象属性的最常见值过滤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:59:52