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