关于java:按对象的变量对对象的链接列表进行排序

Sort a LinkedList of objects by object's variable

本问题已经有最佳答案,请猛点这里访问。

这是我的问题,我有一个LinkedList对象,它有一个String名称和一个int评分值。

现在,我需要根据分数值按降序对这个列表进行排序。

我该怎么做?我试过使用Collections.sort(List),但这不适用于对象。

我如何告诉Java使用分数作为比较的值?


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解决方案:

1
Collections.sort(list, Comparator.comparingInt(obj -> obj.score).reversed());

reversed()表示降序,这与obj.score比较。

正如iaune所指出的,如果正确使用封装,那么obj -> obj.score可以替换为ObjType::getScore


只要Objects可以通过java.lang.Comparablejava.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;
    }
});