思路: 排序肯定還是要排的, 按照Java成績來進行排練. 然後排名的時候,進行比較. 如果這壹名的成績和上壹名的相同, 那麽名次相同, 如果比上壹名分數低,那麽排名加壹.
可以使用傳統的,集合排序,輸出. 也可以使用java8新提供的Stream API進行操作
參考代碼如下
import?java.util.*;import?java.util.Map.Entry;
import?java.util.stream.Collectors;
class?Stu?{//?學生類
private?String?name;
private?double?score;//?成績
public?Stu(String?name,?double?score)?{
this.name?=?name;
this.score?=?score;
}
public?double?getScore()?{
return?score;
}
public?void?setScore(double?score)?{
this.score?=?score;
}
public?String?getName()?{
return?name;
}
public?void?setName(String?name)?{
this.name?=?name;
}
}
//測試類
public?class?TestDemo?{
public?static?void?main(String[]?args)?{
List<Stu>?stus?=?Arrays.asList(new?Stu("Tom",?79.5),?new?Stu("Jack",?52),?new?Stu("Amdy",?79.5),
new?Stu("Lucy",?68),?new?Stu("Cherry",?79.5),?new?Stu("Jerry",?52),?new?Stu("Sweet",?91),
new?Stu("Solem",?65));
fun1(stus);
System.out.println("---------------分割線---------------------");
fun2(stus);
}
//?方法壹:傳統的方法
public?static?void?fun1(List<Stu>?stus)?{
//?按照成績排序
stus.sort(new?Comparator<Stu>()?{
@Override
public?int?compare(Stu?s1,?Stu?s2)?{
return?-Double.compare(s1.getScore(),?s2.getScore());
}
});
int?index?=?0;//?排名
double?lastScore?=?-1;//?最近壹次的分
for?(int?i?=?0;?i?<?stus.size();?i++)?{
Stu?s?=?stus.get(i);
if?(Double.compare(lastScore,?s.getScore())!=0)?{?//?如果成績和上壹名的成績不相同,那麽排名+1
lastScore?=?s.getScore();
index++;
}
System.out.println("名次:"?+?index?+?"\t分數"?+?s.getScore()?+?"\t名字"?+?s.getName());
}
}
//?方法2:?Java8開始支持的Lambada表達式配合?Stream?API?來進行分組排序
public?static?void?fun2(List<Stu>?stus)?{
List<Entry<Double,?List<Stu>>>?list?=?stus.stream().collect(Collectors.groupingBy(Stu::getScore)).entrySet()
.stream().sorted((s1,?s2)?->?-Double.compare(s1.getKey(),?s2.getKey())).collect(Collectors.toList());
int?index?=?1;
for?(Entry<Double,?List<Stu>>?entry?:?list)?{
System.out.print("名次:"?+?index?+?"\t分數:"?+?entry.getKey()?+?"\t名字");
entry.getValue().forEach((s)?->?System.out.print("?"?+?s.getName()));
System.out.println();
index++;
}
}
}
輸出結果
名次:1 分數91.0 名字Sweet名次:2 分數79.5 名字Tom
名次:2 分數79.5 名字Amdy
名次:2 分數79.5 名字Cherry
名次:3 分數68.0 名字Lucy
名次:4 分數65.0 名字Solem
名次:5 分數52.0 名字Jack
名次:5 分數52.0 名字Jerry
名次:1 分數:91.0 名字?Sweet
名次:2 分數:79.5 名字?Tom?Amdy?Cherry
名次:3 分數:68.0 名字?Lucy
名次:4 分數:65.0 名字?Solem
名次:5 分數:52.0 名字?Jack?Jerry
---------------分割線---------------------
名次:1 分數:91.0 名字?Sweet
名次:2 分數:79.5 名字?Tom?Amdy?Cherry
名次:3 分數:68.0 名字?Lucy
名次:4 分數:65.0 名字?Solem
名次:5 分數:52.0 名字?Jack?Jerry