这是我的问题,我有一个对象的LinkedList。这个对象有String类型的名称和int类型的分数值。
现在,我需要按照分数值的降序对这个列表进行排序。
我该怎么做?我试过使用Collections.sort(List),但它不适用于对象。
我如何告诉Java使用分数作为比较的值呢?
现在,我需要按照分数值的降序对这个列表进行排序。
我该怎么做?我试过使用Collections.sort(List),但它不适用于对象。
我如何告诉Java使用分数作为比较的值呢?
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}]
除了其他答案,这里有一个简洁的Java 8解决方案:
Collections.sort(list, Comparator.comparingInt(obj -> obj.score).reversed());
< p > reversed()
方法是用于降序排列,它按照 obj.score
进行比较。
< p > 如 Iaune 所指出的,如果正确使用封装,obj -> obj.score
可以被替换为 ObjType::getScore
。
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;
}
});
LinkedHashMap
吗?LinkedList没有K,V对。 - SiddharthaLinkedList<TeamDescription>
的东西,其中TeamDescription
是一个包含String
和int
的类。 - Bartosz Przybylski