我正在尝试从员工列表中检索薪水最低的列表。到目前为止,我已经设法找到 了 薪水最低 的 员工,但是如果几个员工的薪水相同,我想检索多个员工。
我认为解决方案应该是一成不变的。因此,我无法创建一个薪水最低的变量,而只能检查每个薪水是否小于或等于Low_Salary。我尝试了一下,它奏效了。
因此,我相信我的问题是“ .min(比较器)”仅检索最低的一个。
Comparator<Employee> comparator = Comparator.comparing( Employee :: getSalary);
List<Employee> lowSalary = employees.stream()
.min(comparator)
.stream()
.collect(Collectors.toList());
lowSalary.forEach(System.out::println);
首先创建一个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) {
/*
* We have found a smaller element than what we already have. Clear the list and
* add this smallest element to it.
*/
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)));
问题内容: 假设您得到以下名为Employee的简单数据库表,该表具有2个列,分别名为Employee ID和Salary: 我想写一个查询,从员工那里选择max(salary)作为max_salary,2nd_max_salary 然后它应该返回 我知道如何找到第二高的薪水 或找到第n个 但我无法弄清楚如何将这2个结果结合起来以获得所需的结果 问题答案: 您可以只运行2个查询作为内部查询以返回2
我尝试使用GitHub API和endpoint检索GitHub用户的成员身份详细信息。 我是多个组织的成员,但我得到的回应是: 所以没有为我的用户显示会员信息。我有一个范围为的访问令牌。我错过什么了吗?我在官方API文档https://developer.github.com/v3/orgs/members/#list-your-organization-memberships中也找不到任何相关
问题内容: 我需要获得fname,lname,比平均工资低400.00美元的员工薪水,即使在加薪10%之后。 我能够使薪水低于平均薪水的员工,但不确定如何使加薪后的薪水低于400美元的员工。 我正在使用MySQL。谢谢你。 这给了我工资低于平均工资的员工: 我当时在想这样的事情,但这是行不通的。未知专栏新闻: 问题答案: 您有一个正确的想法,就是不能在这样的子句中使用别名。只需直接使用公式,就可以
员工属于一个部门(外键=D_ID)。员工有一个SSN(主键)、姓名、工资和D_ID。
问题内容: 假设有工资表: 我目前正在使用此代码(AutoIT脚本: 因此,如果Hour_number在低小时或高小时之间,那两个查询是完美的。我需要某种查询,它基本上会执行以下操作: 然后将其重复为“默认”,因为找不到该员工。 补充:如果仅通过1个查询未找到$ Employee,是否可以尝试使用“ Default”? 问题答案: 如果仅通过1个查询未找到$ Employee,是否可以尝试使用“
问题内容: 我需要有一个清单,每个部门只有一名最高薪水雇员。allEmployees是源列表。 问题答案: 您可以使用分组收集器来做到这一点: 与静态导入 此代码创建了所有员工的,并在的帮助下将其与部门分组。对于分类为同一键的所有值,我们只需要保留薪水最高的员工,因此我们将其与进行比较,比较器会将薪金与进行比较。由于返回一个(以处理列表为空的情况),我们通过调用来包装它,并返回一个仅返回雇员的装订