java将对象集合中按某字段大小给另一字段添加排名字段值相同的排名也相同
可以使用Java8的流式操作和Lambda表达式来实现此功能。假设有一个Student类,其中包含字段id和score,需要按照score字段的大小给id字段添加排名,score值相同的排名也相同,则可以按以下步骤操作:
- 将对象集合转换成流
- 根据score字段进行排序
- 使用IntStream.range()方法生成排名
- 将排名和id字段进行映射
- 将映射结果保存到一个Map中
具体代码如下:
import java.util.*;
import java.util.stream.*;
public class Student {
private int id;
private int score;
public Student(int id, int score) {
this.id = id;
this.score = score;
}
public int getId() {
return id;
}
public int getScore() {
return score;
}
public static void main(String[] args) {
List<Student> students = Arrays.asList(
new Student(1, 90),
new Student(2, 80),
new Student(3, 80),
new Student(4, 70)
);
Map<Integer, Integer> rankMap = students.stream()
.sorted(Comparator.comparingInt(Student::getScore).reversed())
.mapToInt(Student::getScore)
.distinct()
.mapToObj(score -> IntStream.range(1, students.size() + 1)
.filter(i -> students.get(i - 1).getScore() == score)
.mapToObj(i -> new AbstractMap.SimpleEntry<>(students.get(i - 1).getId(), i))
.collect(Collectors.toList()))
.flatMap(List::stream)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println(rankMap);
}
}
输出结果为:
{1=1, 2=2, 3=2, 4=4}
其中,key表示id字段,value表示排名。可以看到,id为1的学生得到了第一名,id为2和3的学生得到了第二名,id为4的学生得到了第四名。注意,由于score值相同的学生得到了相同的排名,因此id为2和3的学生得到了相同的排名
原文地址: https://www.cveoy.top/t/topic/hupI 著作权归作者所有。请勿转载和采集!