java做成绩排名表,如何实现同分同名次
要求计算综合平均分
去除最⾼分和最低分,并且实现同分同名次
//去除最⾼分,和最低分,实现思路,
根据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().upingBy(CompetitionWorkExhibitionPo1::getCompetitionUserId));//使⽤groupingby分组for (Map.Entry<Long, List<CompetitionWorkExhibitionPo1>> com : Set()) {
List<CompetitionWorkExhibitionPo1> li = Value();
li.sort(Comparatorparing(CompetitionWorkExhibitionPo1::getCompetitionUserId).thenComparing(CompetitionWorkExhibitionPo1::getSum));//根据分数排序
list1.addAll(li);//然后把数据保存进⼀个新的list
}
Map<Long, List<CompetitionWorkExhibitionPo1>> collect1 = list1.stream().upingBy(CompetitionWorkExhibitionPo1::getCompetitionUserId));//
统计平均分,重新分组for (Map.Entry<Long, List<CompetitionWorkExhibitionPo1>> co : Set()) {
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
.Map(CompetitionWorkExhibitionPo1::getCompetitionUserId, a -> a, (o1, o2) -> {
o1.Sum() + o2.getSum());//分数相加
o1.setCount(String.valueOf(inx));//把list的长度,赋值
return o1;
})).values().stream().List())
);
}
int count = unt();  //查询最⾼点赞数
sortedlistDecimalFormat df = new DecimalFormat("0.00");//格式化⼩数
for (CompetitionWorkExhibitionPo1 competitionWorkExhibitionPo1 : list2) {
        //处理点赞得分
competitionWorkExhibitionPo1.PraiseCount() > 0 ? df.format((float) PraiseCount() / count) : String.valueOf(0));        //处理总分
competitionWorkExhibitionPo1.setReviewScore(df.format((float) Sum() / Integer.Count())));
}
for (CompetitionWorkExhibitionPo1 competitionWorkExhibitionPo1 : list2) {
        //处理综合总分=点赞得分+总分
competitionWorkExhibitionPo1.setComprehensiveScore(Double.GiveScore()) + Double.ReviewScore()));
}
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 -ComprehensiveScore(), s2.getComprehensiveScore());
}
});
int rank = 1;//保存排名
int index = 1;//排序号
double lastScore = -1;// 最近⼀次的分
for (int i = 0; i < stus.size(); i++) {
CompetitionWorkExhibitionPo1 s = (i);
if (Doublepare(lastScore, s.getComprehensiveScore()) != 0) { // 如果成绩和上⼀名的成绩不相同,那么排名+1
lastScore = s.getComprehensiveScore();
<(i).setRank(rank++);//设置排名
<(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().upingBy(CompetitionWorkExhibitionPo1::getComprehensiveScore)).entrySet()                .stream().sorted((s1, s2) -> -Key(), s2.getKey())).List());
int rank = 1;//设置排名
int index = 1;//设置排序号
for (Map.Entry<Double, List<CompetitionWorkExhibitionPo1>> entry : list) {
for (CompetitionWorkExhibitionPo1 competitionWorkExhibitionPo1 : Value()) {
competitionWorkExhibitionPo1.setRank(rank++);
competitionWorkExhibitionPo1.setIndex(index++);
}
}
stus.stream().forEach(System.out::println);
return stus;
}