以下是我的问题,我有一个LinkedList
个对象,其中String
名称和int
得分值。
现在,我需要根据分数值按降序对此列表进行排序。
我该怎么做?我尝试使用Collections.sort(List)
,但这并不适用于对象。
如何告诉Java使用分数作为比较值?
答案 0 :(得分:7)
Collections.sort
方法接受比较器作为其第二个参数。
您可以传入一个比较器,用于定义所需的排序。
例如,给定Person
类:
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
与自定义比较器一起使用,按照以下分数的降序对人员进行排序:
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);
这将输出:
before: [Person{name='Jack', score=3}, Person{name='Mike', score=9}] after: [Person{name='Mike', score=9}, Person{name='Jack', score=3}]
答案 1 :(得分:3)
除了其他答案,这里还有一个简洁的Java 8解决方案:
Collections.sort(list, Comparator.comparingInt(obj -> obj.score).reversed());
reversed()
是降序排列,按obj.score
进行比较。
如Iaune所述,如果您正确使用Encapsulation,obj -> obj.score
可以替换为ObjType::getScore
。
答案 2 :(得分:0)
Collections.sort(List)
适用于Objects
,只要Objects
可以通过java.lang.Comparable
或java.util.Comparator
相互比较。由于您的Objects
需要自定义排序,你需要实现一个比较器
Collections.sort(list,new Comparator(){
@Override
public int compare(MyObject obj1,MyObject obj2){
return obj2.score - obj1.score;
}
});