如何在list中给排名参数rank赋值

项目里面碰到了给数据从小到大排序,并且给单位数据排名的需求,目前排序已经好了,但是不知道如何用java把对象list里的参数rank赋值(目前rank都是默认值0),图中左边的就是我目前取出来的数据(里面还有null值),右边的是需要用java加上的rank值,要求同样的值排名rank也相同,求各位看看怎么做比较好

img

参考GPT:可以使用Java的Collections.sort()方法进行排序,然后遍历排序后的List,为每个对象设置排名参数rank。

具体来说,可以定义一个实现Comparator接口的类,用来比较List中的对象大小,并在该类中实现compare()方法。然后在排序时将该类的实例作为参数传入Collections.sort()方法中,以进行排序。

接着,遍历排好序的List,给每个对象设置排名参数rank。对于同样大小的对象,可以在比较大小时定义它们的排名相同,这样就可以保证排名相同的对象具有相同的排名参数rank。

下面是一个示例代码:

import java.util.*;

class MyComparator implements Comparator<MyObject> {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        if (o1.getValue() < o2.getValue()) {
            return -1;
        } else if (o1.getValue() > o2.getValue()) {
            return 1;
        } else {
            return 0;
        }
    }
}

class MyObject {
    private double value;
    private int rank;

    public MyObject(double value) {
        this.value = value;
    }

    public double getValue() {
        return value;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }

    public int getRank() {
        return rank;
    }
}

public class Main {
    public static void main(String[] args) {
        List<MyObject> list = new ArrayList<MyObject>();
        list.add(new MyObject(1.0));
        list.add(new MyObject(1.03));
        list.add(new MyObject(1.09));
        list.add(new MyObject(1.14));
        list.add(new MyObject(1.16));
        list.add(new MyObject(1.17));
        list.add(new MyObject(1.18));
        list.add(new MyObject(1.51));
        list.add(new MyObject(1.61));
        list.add(new MyObject(1.64));
        list.add(new MyObject(123));

        // 排序
        Collections.sort(list, new MyComparator());

        // 遍历排序后的List,为每个对象设置排名参数rank
        int rank = 1;
        for (int i = 0; i < list.size(); i++) {
            MyObject obj = list.get(i);
            if (obj.getValue() == Double.NaN) {
                // 处理NaN值
                obj.setRank(0);
            } else if (i > 0 && obj.getValue() == list.get(i-1).getValue()) {
// 处理与前一个元素相等的情况,排名相同
obj.setRank(list.get(i-1).getRank());
} else {
// 正常情况下,排名递增
obj.setRank(rank);
rank++;
}
}
// 打印每个对象的值和排名参数rank
    for (MyObject obj : list) {
        System.out.println("value: " + obj.getValue() + ", rank: " + obj.getRank());
    }
}
}

输出结果如下:

value: 1.0, rank: 1
value: 1.03, rank: 2
value: 1.09, rank: 3
value: 1.14, rank: 4
value: 1.16, rank: 5
value: 1.17, rank: 6
value: 1.18, rank: 7
value: 1.51, rank: 8
value: 1.61, rank: 9
value: 1.64, rank: 10
value: 123.0, rank: 11


这段代码中,定义了一个MyComparator类来实现Comparator接口,用于比较MyObject对象的大小。然后,在主函数中,创建了一个List对象,并添加了一些元素。

接下来,调用Collections.sort()方法对List进行排序,并使用一个变量rank来记录每个元素的排名。在遍历List时,根据元素的值以及与前一个元素的大小关系,分别处理排名参数rank的赋值。最后,输出每个元素的值和排名参数rank。

该代码可以对任意类型的对象进行排序,并为每个对象设置排名参数rank。


//该方法可用于分数成绩排名计算操作
    //传入需要处理的用户成绩集合和分数
    public int getClassRank(List<UserExamScoreVo> list,double userScore){
        ArrayList<Double> arrayList = new ArrayList();
        Map map = new HashMap();
        //将需要排序的字段放入集合
        for(int p = 0; p < list.size(); p++){
            arrayList.add( Double.valueOf(list.get(p).getScore()));
        }
        //用户成绩为key,循坏下标为value生成map
        for (int i = 0; i < arrayList.size() ; i++) {
            if(i == 0){
                map.put(arrayList.get(0),0 + 1);
            }
            if(!map.containsKey(arrayList.get(i))){
                map.put(arrayList.get(i),i+1);
            }
        }
        //从map中取得对应的位置
        int rank = (int) map.get(userScore);
        return rank;
    }

在然后排名的时候进行比较. 如果这一名的用户成绩分数和上一名的相同, 那么名次相同, 如果比上一名分数低,那么排名加一
用法,传入你的list和某个值,返回对应的排名

https://blog.csdn.net/weixin_39709134/article/details/127104119

https://www.cnblogs.com/interdrp/p/16333162.html

没有很懂你的意思,感觉不会怎么简单,是要把数据和排名放到一个对象里吗,那一个用map集合菜才对

```java
//list是你左侧数据,rank 为排名
List<Integer> rank = new ArrayList<>(list.size());

Collections.sort(list);

for (int i = 0; i < list.size(); i++) {
    rank.add(list.indexOf(list.get(i)) + 1);
}

System.out.println(list);
System.out.println(rank);

```

写一个实体
A{
名称
分数
排名
}

在写个list
把数据一个一个放到list中
然后循环就可以得到了