这个list里面是对象来的,假如:
class stu{
String name;
String score;//分数
String rank;//名次
}
List students=new ArrayList();
students.add(new stu('张3','60',''));
students.add(new stu('张4','65',''));
students.add(new stu('张5','65',''));
students.add(new stu('张6','80',''));
//----------------------------------------
syso(students)//假设目前的输出的顺序已经是按照从小到大的来输出,名次现在还是空的。
如果分数相同,名次不相同的话:
int num=stu.size();
for(stu s:students){
s.rank=num;
num--;
}//这样子应该就可以了,但是如果想要分数相同,名次也一样,然后再输出来,应该怎么弄,
我想了好久,用了冒泡和选择排序都没有解决问题,应该是哪里没有考虑周道,我是实在想不到了,哪位大哥帮帮忙。
for (int i = 1; i < students.size(); i++)
{
for (int j = 0; j < listMineRs.Count - i; j++)
{
if (students[j].score < students[j + 1].score)
{
stu temp = listMineRs[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
# 然后再循环一遍这个list给他们的排名赋值
int count = 1;
for(int i=0;i<students.size();i++)
{
if(i=0)
{
students[i].rank=count;
count++;
}
else{
if(students[i].score==students[i-1].score){
students[i].rank=students[i-1].rank;
}else{
students[i].rank = count;
count++;
}
}
}
class stu {
public stu(String name, int score) {
this.name = name;
this.score = score;
}
String name;
int score;// 分数
int rank;// 名次
}
@Test
public void arrayListTest() {
List<stu> students = new ArrayList<stu>();
students.add(new stu("张3", 80));
students.add(new stu("张4", 65));
students.add(new stu("张5", 65));
students.add(new stu("张6", 60));
List<stu> students1 = new ArrayList<stu>();
for(int i=0,j=1,s=students.get(0).score;i<students.size();i++) {
stu stus=students.get(i);
if(s==stus.score)
stus.rank=j;
else {
stus.rank=++j;
s=stus.score;
}
students1.add(stus);
}
for (stu stu : students1) {
System.out.println(stu.name+"rank:"+stu.rank);
}
}
没有做排序
定义Comparator之后,直接用Collections.sort方法,就能输出结果,不需要你自己用算法实现。
https://www.cnblogs.com/tomyLi/p/JAVA8rang-dai-ma-geng-you-ya-zhiList-pai-xu.html
循环一次就可以了,前提是list是从大到小排序的,这个换一个sort方法就可以实现了
设置两个标量,一个标量是当前分数score=100,和当前名次rank=1
循环list,如果stu的分数等于score 则设置名次为rank,如果小于score,则score=stu.score ,并且名次增加1,同时设置stu.rank=rank;
students.sort((s1, s2) -> s1.score().compareTo(s2.score()));
这个结束之后,students应该就是排好顺序的,然后tank自己按顺序填写一下。
没调试,你自己调试一下。
更正,s.score 没有括号。
如果按照你从小到大同样的道理 也是可以的。
很简单啊,你变成从大到小进行排列,用一个变量temp1记录上一个人的成绩,另一个变量temp2来记录成绩相同的次数,如果上一个人的成绩和你当前人的成绩相同的话,那么名次就想同,同时将temp2+1,直到成绩不相同的时候,这个时候,你先将上一个人的名次+temp2,同时将temp2置1.
/**
* 对已经排过序的list 计算排名
* @title: getBeforTen
* @param ffaid
* @return List
*/
public List getBeforTen(String ffaid){
List list = new ArrayList();
List daolists = dao.getBeforTen(ffaid);
int cishu = 1;
int paiming = 1;
double tempPrinot = 0;
for (int i = 0; i < daolists.size(); i++) {
PlayTeamandfhInfoBean infoBean = daolists.get(i);
if(i != 0){
if(tempPrinot == infoBean.getPlaygrade()){
cishu = cishu + 1;
}else{
tempPrinot = infoBean.getPlaygrade();
paiming = paiming + cishu;
cishu = 1;
}
}else{
tempPrinot = infoBean.getPlaygrade();
}
infoBean.setPaiming(paiming);
list.add(infoBean);
}
return list;
}