Sort a LinkedList of objects by object's variable
这是我的问题,我有一个LinkedList对象,它有一个String名称和一个int评分值。
现在,我需要根据分数值按降序对这个列表进行排序。
我该怎么做?我试过使用Collections.sort(List),但这不适用于对象。
我如何告诉Java使用分数作为比较的值?
- 你是说你有一个LinkedHashMap?LinkedList没有k、v对。
- collections.sort有一个可以传递comparator的版本。DOCS.Oracle .com /JavaSe/ 7 /DOCS/API/Java/UTL/Helip;
- 我不(?)这将是我第一次对列表进行排序,就像以前我使用数组一样,所以我是个新手。高中生,如果能提供我对Java的了解
- 确保您了解List、Map和Set之间的区别。您所描述的是一个Map,它包含一个键(字符串名称)和一个对应的值(int score)。
- @在我看来,他有点像LinkedList,其中TeamDescription是String和int的类。
- @Siddhartha可能是自定义对象列表,我们不知道。他没有显示任何代码。我想是从这个LinkedList of objects, which have a String name and a int score value.开始的。
- 啊,我被纠正了。
- 这个。我的单子是这样的:LinkedList DopplerList。
Collections.sort方法接受比较器作为第二个参数。您可以传递一个比较器来定义您想要的顺序。例如,给定一个Person类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Person {
private final String name ;
private final int score ;
Person (String name, int score ) {
this. name = name ;
this. score = score ;
}
@Override
public String toString () {
return"Person{" +
"name='" + name + '\'' +
", score=" + score +
'}';
}
} |
您可以使用带自定义比较器的Collections.sort按分数降序对人员进行排序,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12
| List <Person > list = new LinkedList <>(Arrays. asList(new Person ("Jack", 3), new Person ("Mike", 9)));
System. out. println("before:" + list );
Collections. sort(list, new Comparator <Person >() {
@Override
public int compare (Person o1, Person o2 ) {
return o2. score - o1. score;
}
});
System. out. println("after:" + list ); |
这将输出:
1 2
| before: [Person{name='Jack', score=3}, Person{name='Mike', score=9}]
after: [Person{name='Mike', score=9}, Person{name='Jack', score=3}] |
与其他答案一样,这里有一个简洁的Java 8解决方案:
reversed()表示降序,这与obj.score比较。
正如iaune所指出的,如果正确使用封装,那么obj -> obj.score可以替换为ObjType::getScore。
- 可能是obj.getScore()或是什么vertheclassiscalled::getScore,假设字段不是公共的-它们不应该是;-)。+1对于这个简洁的定义。
- @投反对票的人,请在我的答案中留下一个解释问题的评论,这样我就可以解决问题了。
- 不是我,但请看我的评论。
只要Objects可以通过java.lang.Comparable或java.util.Comparator相互比较,Collections.sort(List)就可以为Objects工作。由于Objects需要自定义排序,所以需要实现一个比较器。
1 2 3 4 5 6
| Collections. sort(list, new Comparator(){
@Override
public int compare (MyObject obj1,MyObject obj2 ){
return obj2. score - obj1. score;
}
}); |