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}
。