栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用信息流检索薪水最低的员工列表

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用信息流检索薪水最低的员工列表

首先创建一个

TreeMap
,其关键是薪水。
TreeMap
按键对条目进行排序。然后获取第一个条目,即薪水最低的条目,并掌握与此相关的值。此解决方案仅对列表进行一次迭代。这是它的外观。

List<Employee> empsWithLowestSalary = employees.stream()    .collect(Collectors.groupingBy(Employee::getSalary, TreeMap::new, Collectors.toList()))    .firstEntry()    .getValue();

TreeMap
将地图元素存储在红黑树中。红黑树中一个元素的插入成本为
O(Log(n))
。由于我们要插入
n
元素,因此该解决方案的总时间复杂度为
O(n Log(n))
。对于
firstEntry()
,它需要固定的时间
O(1)
,因为它分别维护着指向树中最左边和最右边叶子节点的指针。最左边的节点代表树中的最小值,而最右边的叶子节点代表树的最大值。

仅仅遵循了这个很好的答案,我想到了写一个符合我们目的的定制收集器。该收集器仅对List进行一次迭代,其运行时复杂度为O(n),明显优于上述方法。此外,它允许您在一个语句中编写客户代码。这是它的外观。

static <T> Collector<T, ?, List<T>> minList(Comparator<? super T> comp) {    return Collector.of(ArrayList::new, (list, t) -> {        int c;        if (list.isEmpty() || (c = comp.compare(t, list.get(0))) == 0) list.add(t);        else if (c < 0) {  list.clear(); list.add(t);        }    }, (list1, list2) -> {        if (comp.compare(list1.get(0), list2.get(0)) < 0) return list1;        else if (comp.compare(list1.get(0), list2.get(0)) > 0) return list2;        else { list1.addAll(list2); return list1;        }    });}

这是您的客户代码。

Collection<Employee> empsWithLowestSalary = employees.stream()     .collect(minList(Comparator.comparing(Employee::getSalary)));


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/454473.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号