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

如何使用自定义reduce方法实现列表去重?需调用reduce并判断元素是否存在

解决自定义reduce实现distinct方法的问题

嘿,这事儿不难,咱们一步步来搞定它!

首先,你已经有了现成的reduce方法,现在要实现distinct,核心就是在accumulator里做两件事:判断当前元素是否已经在累加的列表里,不在就添加进去,最后返回这个列表就行。

完整的distinct方法实现

@Override 
public List<E> distinct() { 
    List<E> list = new LinkedList<E>(); 
    return reduce(list, (a, b) -> {
        // 检查当前元素b是否不在累加列表a中
        if (!a.contains(b)) {
            a.add(b);
        }
        // 返回更新后的累加列表(因为List是引用类型,修改的是同一个对象,但必须返回它)
        return a;
    }); 
}

为什么这么写?

  • reduce方法会从你传入的空LinkedList(也就是identity)开始,遍历原集合的每一个元素。
  • 每次迭代时,accumulator的两个参数:
    • a:当前已经完成去重的列表(初始是空列表)
    • b:原集合中正在处理的当前元素
  • 我们用!a.contains(b)判断元素是否未被添加过,没添加过就调用a.add(b)把它加进去,最后返回a作为下一次迭代的累加器。

小提示

如果你的数据集很大,LinkedList.contains()是线性查找,性能会有点拉胯。如果要优化的话,可以额外维护一个HashSet来辅助判断,但因为题目要求必须以空列表作为identity调用reduce,所以上面的实现是完全符合要求的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:47:10