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

Java技术实现:如何找出列表中重复次数最多的前3个对象

找出列表中出现次数最多的前3个对象实现方案

嘿,这个需求我熟!咱们可以分几步来实现,结合你现有的代码,我给你写个完整的示例:

首先,咱们得先统计每个对象的出现频率,然后对频率排序,最后取出前3个输出。直接上代码:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class TopObjectsFinder {
    public static void main(String[] args) {
        // 你现有的列表初始化
        List<Object> listOfObjects = new ArrayList<Object>();
        Object object1 = new Object() {
            @Override
            public String toString() {
                return "object1";
            }
        };
        Object object2 = new Object() {
            @Override
            public String toString() {
                return "object2";
            }
        };
        Object object3 = new Object() {
            @Override
            public String toString() {
                return "object3";
            }
        };
        Object object4 = new Object() {
            @Override
            public String toString() {
                return "object4";
            }
        };
        listOfObjects.add(object1);
        listOfObjects.add(object2);
        listOfObjects.add(object2);
        listOfObjects.add(object3);
        listOfObjects.add(object3);
        listOfObjects.add(object3);
        listOfObjects.add(object4);

        // 第一步:统计每个对象的出现次数
        Map<Object, Integer> frequencyMap = new HashMap<>();
        for (Object obj : listOfObjects) {
            frequencyMap.put(obj, frequencyMap.getOrDefault(obj, 0) + 1);
        }

        // 第二步:按出现次数降序排序,次数相同可按对象toString排序(可选)
        List<Map.Entry<Object, Integer>> sortedEntries = frequencyMap.entrySet()
                .stream()
                .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
                .collect(Collectors.toList());

        // 第三步:取出前3个(如果列表不足3个就取全部)
        int topN = Math.min(3, sortedEntries.size());
        List<Map.Entry<Object, Integer>> topEntries = sortedEntries.subList(0, topN);

        // 第四步:按期望格式输出
        System.out.println("Your top results are:");
        for (int i = 0; i < topEntries.size(); i++) {
            Map.Entry<Object, Integer> entry = topEntries.get(i);
            System.out.printf("%s (%d times)%s", entry.getKey(), entry.getValue(), 
                    i != topEntries.size() - 1 ? ", " : "");
        }
    }
}

关键步骤解释:

  • 统计频率:用HashMap遍历列表,getOrDefault方法简化了计数逻辑,不用额外判断key是否存在。
  • 排序处理:通过Java Stream把Map的键值对转换成流,按出现次数倒序排序;如果需要次数相同的对象按其他规则排序,自定义Comparator即可。
  • 边界处理:用Math.min避免列表元素不足3个时出现数组越界问题,保证代码健壮性。
  • 输出格式:完全贴合你给出的示例风格,每个对象标注出现次数,最后一个元素不带多余逗号。

运行这段代码的输出结果是:

Your top results are:
object3 (3 times), object2 (2 times), object1 (1 times)

⚠️ 注意:如果你的实际对象是自定义类,一定要重写equals和hashCode方法!不然HashMap会把不同实例当成不同对象统计,结果会出错哦~

内容的提问来源于stack exchange,提问作者codey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:52:58