java根据集合中对象的属性值大小生成排名

 1:根据对象属性降序排列

  public static <T extends Comparable<? super T>> LinkedHashMap<T, Integer> calculateRanking(List<ProductPerformanceInfoVO> dataList, Function<ProductPerformanceInfoVO, T> keyExtractor) {
        LinkedHashMap<T, Integer> rankingMap = new LinkedHashMap<>();
        List<T> distinctKeys = dataList.stream()
                .map(keyExtractor)
                .distinct()
                .sorted(Comparator.reverseOrder())
                .collect(Collectors.toList());
        for (int i = 0; i < distinctKeys.size(); i++) {
            rankingMap.put(distinctKeys.get(i), i + 1);
        }
        return rankingMap;
    }

2:根据对象属性升序排列
 

public static <T extends Comparable<? super T>> LinkedHashMap<T, Integer> calculateRanking(List<ProductPerformanceInfoVO> dataList, Function<ProductPerformanceInfoVO, T> keyExtractor) {
        LinkedHashMap<T, Integer> rankingMap = new LinkedHashMap<>();
        List<T> distinctKeys = dataList.stream()
                .map(keyExtractor)
                .distinct()
                .sorted()
                .collect(Collectors.toList());
        for (int i = 0; i < distinctKeys.size(); i++) {
            rankingMap.put(distinctKeys.get(i), i + 1);
        }
        return rankingMap;
    }

 3:方法调用

LinkedHashMap<BigDecimal, Integer> rankingMap = EntityConvertUtil.calculateRanking(returnDataList, ProductPerformanceInfoVO::getSalesVolume);

4:说明

方法添加泛型约束 <T extends Comparable<? super T>>,确保 T 可以进行自然排序(如 Integer, String 等)。如果 T 是自定义类型且未实现 Comparable,则需提供显式 Comparator;

5:示例场景:

假设 keyExtractor 提取的是 Integer 类型的值,原始数据为 [3, 1, 4, 1, 5]

  • 升序:排序后的键为 [1, 3, 4, 5],排名为 {1=1, 3=2, 4=3, 5=4}
  • 降序:排序后的键为 [5, 4, 3, 1],排名为 {5=1, 4=2, 3=3, 1=4}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值