按对象的变量对对象的LinkedList进行排序

时间:2015-10-17 18:32:07

标签: java list sorting object

以下是我的问题,我有一个LinkedList个对象,其中String名称和int得分值。

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

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

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

3 个答案:

答案 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所述,如果您正确使用Encapsulationobj -> obj.score可以替换为ObjType::getScore

答案 2 :(得分:0)

Collections.sort(List)适用于Objects,只要Objects可以通过java.lang.Comparablejava.util.Comparator相互比较。由于您的Objects需要自定义排序,你需要实现一个比较器

Collections.sort(list,new Comparator(){
    @Override
    public int compare(MyObject obj1,MyObject obj2){
        return obj2.score - obj1.score;
    }
});