gpt4 book ai didi

java - 使用 Lambda 对列表进行排序和分组

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:08:35 24 4
gpt4 key购买 nike

让我们假设我有一个员工列表:

private static List<Employee> list = new ArrayList<Employee>();
static {
list.add(new Employee("Joe", 100000, 1980));
list.add(new Employee("Tim", 50000, 1982));
list.add(new Employee("Mike", 90000, 1970));
list.add(new Employee("Rick", 50000, 1955));
list.add(new Employee("Andy", 60000, 1966));
list.add(new Employee("Tim", 10000, 1995));
list.add(new Employee("Tony", 130000, 1991));
list.add(new Employee("Timmy", 150000, 1988));
list.add(new Employee("Rich", 50000, 1980));
list.add(new Employee("Andrew", 160000, 1970));
list.add(new Employee("Ton", 150000, 1958));
list.add(new Employee("Jose", 40000, 1970));
list.add(new Employee("Timothy", 50000, 1996));
list.add(new Employee("Ricardo", 50000, 1988));
list.add(new Employee("Gemasio", 60000, 1971));
list.add(new Employee("Mike", 80000, 1992));
}

现在我想要的是生成执行一些过滤的列表,例如:工资 > x 和工资 < y并根据员工姓名排序,如果多个员工姓名相同但薪水不同但现在使用他们的薪水,则再次排序

到目前为止我所做的是:

System.out.println(
list.stream()
.filter(e -> e.getSalary() > 55000)
.filter(e -> e.getSalary() < 120000)
.sorted(Comparator.comparing(Employee::getName))
.collect(Collectors.groupingBy(Employee::getName))
);

例如:仅对名称进行排序后我得到::

<name: Andy salary: 60000 year of birth: 1966>, 
<name: Gemasio salary: 60000 year of birth: 1971>,
<name: Joe salary: 100000 year of birth: 1980>,
<name: Mike salary: 90000 year of birth: 1970>,
<name: Mike salary: 80000 year of birth: 1992>

这里有两个迈克,但现在在这两个迈克中,我想以降序的形式对他们的薪水进行排序,这样新的结果将是:

<name: Andy salary: 60000 year of birth: 1966>, 
<name: Gemasio salary: 60000 year of birth: 1971>,
<name: Joe salary: 100000 year of birth: 1980>,
<name: Mike salary: 80000 year of birth: 1970>,
<name: Mike salary: 90000 year of birth: 1992>

除了迈克,我不想更改其他订单

但是我无法得到任何人想要的结果 请帮助我找出问题所在或我需要做些什么才能从这里走得更远。谢谢:)

最佳答案

你可能正在寻找

.sorted(Comparator
.comparing(Employee::getName) //sort by name
.thenComparing(Employee::getSalary)) //in case of same names sort by salary

如果你想使用降序,你可以创建单独的 Comparator,它将根据 Employee::getSalary 进行比较,并使用它的 reversed() 版本如下:

        .sorted(Comparator
.comparing(Employee::getName)
.thenComparing(
Comparator.comparing(Employee::getSalary).reversed()
)
)

groupingBy(Employee::getName) 可能存在的问题是它返回无序的 HashMap。如果你想确保键的顺序基于它的插入(你可能是,否则之前根据名称排序是没有意义的)你可以使用:

.collect(Collectors.groupingBy(Employee::getName, LinkedHashMap::new, Collectors.toList()));

演示:

//code creating list
//...

//our code
Map<String, List<Employee>> grouped = list.stream()
.filter(e -> e.getSalary() > 55000)
.filter(e -> e.getSalary() < 120000)
.sorted(Comparator
.comparing(Employee::getName)
.thenComparing(
Comparator.comparing(Employee::getSalary).reversed()
)
)
.collect(Collectors.groupingBy(Employee::getName, LinkedHashMap::new, Collectors.toList()));

for (Map.Entry<String, List<Employee>> entry : grouped.entrySet()) {
System.out.println(entry.getKey());
for (Employee emp : entry.getValue()) {
System.out.println("\t" + emp);
}
}

输出:

Andy
Employee [name=Andy, salary=60000, yearOfBirth=1966]
Gemasio
Employee [name=Gemasio, salary=60000, yearOfBirth=1971]
Joe
Employee [name=Joe, salary=100000, yearOfBirth=1980]
Mike
Employee [name=Mike, salary=90000, yearOfBirth=1970]
Employee [name=Mike, salary=80000, yearOfBirth=1992]

关于java - 使用 Lambda 对列表进行排序和分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35107192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com