一、排名算法
1.代码如下:
package com.yunhenedu.core.utils.rank;
import com.yunhenedu.core.exception.BusinessException;
import com.yunhenedu.core.exception.ResultEnum;
import java.util.*;
import java.util.stream.Collectors;
public class RankUtils {
public static void main(String[] args) {
List<Integer> scoreList = new ArrayList<>();
scoreList.add(1);
scoreList.add(1);
scoreList.add(2);
scoreList.add(3);
scoreList.add(3);
List<Map<String, Integer>> scoreRankOneList = getScoreRankOneList(scoreList, 1, 6);
List<Map<String, Integer>> scoreRankTwoList = getScoreRankTwoList(scoreList, 1, 6);
System.out.println(scoreRankOneList);
System.out.println(scoreRankTwoList);
}
public static List<Map<String, Integer>> getScoreRankTwoList(List<Integer> scoreList, Integer startRank, Integer endRank) {
Map<Integer, Integer> scoreRankMap = getScoreRankMap(scoreList);
List<Map<String, Integer>> resultList = getScoreRankDataList(startRank, endRank, scoreRankMap);
return resultList;
}
private static List<Map<String, Integer>> getScoreRankDataList(Integer startRank, Integer endRank, Map<Integer, Integer> scoreRankMap) {
if (startRank < 0 || endRank < 0) throw new BusinessException(ResultEnum.ERROR, "输入名次不合法");
List<Map<String, Integer>> resultList = new ArrayList<>();
scoreRankMap.forEach((key, value) -> {
System.out.println(key + ":" + value);
if (value >= startRank && value <= endRank) {
Map<String, Integer> map = new HashMap<>();
map.put("score", key);
map.put(key.toString(), value);
resultList.add(map);
}
});
return resultList;
}
private static Map<Integer, Integer> getScoreRankMap(List<Integer> scoreList) {
Collections.sort(scoreList, Collections.reverseOrder());
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < scoreList.size(); i++) {
if (i == 0) {
map.put(scoreList.get(0), (0 + 1));
}
if (!map.containsKey(scoreList.get(i))) {
map.put(scoreList.get(i), (i + 1));
}
}
return map;
}
public static Integer getRankByScore(List<Integer> scoreList, Integer score) {
Collections.sort(scoreList, Collections.reverseOrder());
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < scoreList.size(); i++) {
if (i == 0) {
map.put(scoreList.get(0), (0 + 1));
}
if (!map.containsKey(scoreList.get(i))) {
map.put(scoreList.get(i), (i + 1));
}
}
return map.get(score);
}
public static List<Map<String, Integer>> getScoreRankOneList(List<Integer> scoreList, Integer startRank, Integer endRank) {
Collections.sort(scoreList, Collections.reverseOrder());
List<Integer> rankList = tagScoreRank(scoreList);
List<Map<String, Integer>> mapList = setScoreRankInfo(scoreList, rankList, startRank, endRank);
return mapList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()
-> new TreeSet<>(Comparator.comparing(po->po.get("score")))), ArrayList::new));
}
private static List<Integer> tagScoreRank(List<Integer> scoreList) {
List<Integer> rendks = new ArrayList<>();
for (int i = 0; i < scoreList.size(); i++) {
Integer item = scoreList.get(i);
if (i != 0) {
Integer upItem = scoreList.get(i - 1);
if (upItem.equals(item)) {
rendks.add(rendks.get(i - 1));
} else rendks.add(i);
} else {
rendks.add(i);
}
}
return rendks;
}
private static List<Map<String, Integer>> setScoreRankInfo(List<Integer> scoreList, List<Integer> rankList, Integer startRank, Integer endRank) {
if (startRank < 0 || endRank < 0) throw new BusinessException(ResultEnum.ERROR, "输入名次不合法");
List<Map<String, Integer>> resultList = new ArrayList<>();
for (int i = startRank - 1; i <= endRank - 1 && i < rankList.size(); i++) {
Integer score = scoreList.get(i);
Map<String, Integer> map = new HashMap<>();
map.put("score", score);
map.put(score.toString(), (rankList.get(i) + 1));
resultList.add(map);
}
return resultList;
}
}