可以使用Java8的流式操作和Lambda表达式来实现此功能。假设有一个Student类,其中包含字段id和score,需要按照score字段的大小给id字段添加排名,score值相同的排名也相同,则可以按以下步骤操作:

  1. 将对象集合转换成流
  2. 根据score字段进行排序
  3. 使用IntStream.range()方法生成排名
  4. 将排名和id字段进行映射
  5. 将映射结果保存到一个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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录