要求計算綜合平均分
去除最高分和最低分,並且實現同分同名次
//去除最高分,和最低分,實現思路,
根據id 使用groupingby分組 然后循環分組的map
接着根據分數進行排序,然后去除最高的和最低分,刪除list 第一條數據,以及最后一條數,這樣就把最高分,和最低分去除
然后統計平均分,實現思路,一樣重新根據id 使用groupingby 重新分組
然后循環數據合並,根據id為key,相同id的數據 進行分數相加
public List<CompetitionWorkExhibitionPo1> getList(List<CompetitionWorkExhibitionPo1> list) { List<CompetitionWorkExhibitionPo1> list1 = new ArrayList<>(); List<CompetitionWorkExhibitionPo1> list2 = new ArrayList<>(); Map<Long, List<CompetitionWorkExhibitionPo1>> collect = list.stream().collect(Collectors.groupingBy(CompetitionWorkExhibitionPo1::getCompetitionUserId));//使用groupingby分組 for (Map.Entry<Long, List<CompetitionWorkExhibitionPo1>> com : collect.entrySet()) { List<CompetitionWorkExhibitionPo1> li = com.getValue(); li.sort(Comparator.comparing(CompetitionWorkExhibitionPo1::getCompetitionUserId).thenComparing(CompetitionWorkExhibitionPo1::getSum));//根據分數排序 li.remove(0);//刪除list 第一條數據 li.remove(li.size() - 1);//以及最后一條數 list1.addAll(li);//然后把數據保存進一個新的list }
Map<Long, List<CompetitionWorkExhibitionPo1>> collect1 = list1.stream().collect(Collectors.groupingBy(CompetitionWorkExhibitionPo1::getCompetitionUserId));//統計平均分,重新分組 for (Map.Entry<Long, List<CompetitionWorkExhibitionPo1>> co : collect1.entrySet()) { List<CompetitionWorkExhibitionPo1> value = co.getValue(); int inx = value.size();//保存list的長度,用戶計算平均分 list2.addAll(//處理完保存到一個新的集合 value.stream() // 表示id為key, 接着如果有重復的,那么從BillsNums對象o1與o2中篩選出一個,這里選擇o1, // 並把id重復,需要將nums和sums與o1進行合並的o2, 賦值給o1,最后返回o1 .collect(Collectors.toMap(CompetitionWorkExhibitionPo1::getCompetitionUserId, a -> a, (o1, o2) -> { o1.setSum(o1.getSum() + o2.getSum());//分數相加 o1.setCount(String.valueOf(inx));//把list的長度,賦值 return o1; })).values().stream().collect(Collectors.toList()) ); }
int count = mapper2.count(); //查詢最高點贊數 DecimalFormat df = new DecimalFormat("0.00");//格式化小數 for (CompetitionWorkExhibitionPo1 competitionWorkExhibitionPo1 : list2) {
//處理點贊得分 competitionWorkExhibitionPo1.setGiveScore(competitionWorkExhibitionPo1.getPraiseCount() > 0 ? df.format((float) competitionWorkExhibitionPo1.getPraiseCount() / count) : String.valueOf(0));
//處理總分 competitionWorkExhibitionPo1.setReviewScore(df.format((float) competitionWorkExhibitionPo1.getSum() / Integer.parseInt(competitionWorkExhibitionPo1.getCount()))); } for (CompetitionWorkExhibitionPo1 competitionWorkExhibitionPo1 : list2) {
//處理綜合總分=點贊得分+總分 competitionWorkExhibitionPo1.setComprehensiveScore(Double.valueOf(competitionWorkExhibitionPo1.getGiveScore()) + Double.valueOf(competitionWorkExhibitionPo1.getReviewScore())); } List<CompetitionWorkExhibitionPo1> competitionWorkExhibitionPo1s = CompetitionRankingService.fun1(list2);//調用方法,得出排名return list2; }
// 方法一:傳統的方法
排序:把不同成績保存map中,最后實體類根據map的key找到排名 存入實體排名里面
public static List<CompetitionWorkExhibitionPo1> fun1(List<CompetitionWorkExhibitionPo1> stus) { // 按照成績排序 stus.sort(new Comparator<CompetitionWorkExhibitionPo1>() { @Override public int compare(CompetitionWorkExhibitionPo1 s1, CompetitionWorkExhibitionPo1 s2) { return -Double.compare(s1.getComprehensiveScore(), s2.getComprehensiveScore()); } }); int rank = 1;//保存排名 int index = 1;//排序號 double lastScore = -1;// 最近一次的分 for (int i = 0; i < stus.size(); i++) { CompetitionWorkExhibitionPo1 s = stus.get(i); if (Double.compare(lastScore, s.getComprehensiveScore()) != 0) { // 如果成績和上一名的成績不相同,那么排名+1 lastScore = s.getComprehensiveScore(); stus.get(i).setRank(rank++);//設置排名 stus.get(i).setIndex(index++);//設置排序號 } } stus.stream().forEach(System.out::println); return stus; }
/ 方法2: Java8開始支持的Lambada表達式配合 Stream API 來進行分組排序
public static List<CompetitionWorkExhibitionPo1> fun2(List<CompetitionWorkExhibitionPo1> stus) { List<Map.Entry<Double, List<CompetitionWorkExhibitionPo1>>> list = stus.stream().collect(Collectors.groupingBy(CompetitionWorkExhibitionPo1::getComprehensiveScore)).entrySet() .stream().sorted((s1, s2) -> -Double.compare(s1.getKey(), s2.getKey())).collect(Collectors.toList()); int rank = 1;//設置排名 int index = 1;//設置排序號 for (Map.Entry<Double, List<CompetitionWorkExhibitionPo1>> entry : list) { for (CompetitionWorkExhibitionPo1 competitionWorkExhibitionPo1 : entry.getValue()) { competitionWorkExhibitionPo1.setRank(rank++); competitionWorkExhibitionPo1.setIndex(index++); } } stus.stream().forEach(System.out::println); return stus; }