如何使用自定义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
相关产品推荐
相关产品推荐

