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

4
这是我的问题,我有一个对象的LinkedList。这个对象有String类型的名称和int类型的分数值。
现在,我需要按照分数值的降序对这个列表进行排序。
我该怎么做?我试过使用Collections.sort(List),但它不适用于对象。
我如何告诉Java使用分数作为比较的值呢?

你的意思是你有一个LinkedHashMap吗?LinkedList没有K,V对。 - Siddhartha
1
Collections.sort有一个版本,可以传递比较器。http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator) - Bartosz Przybylski
这将是我第一次对一个List进行排序,之前我一直在使用Arrays,所以我是新手。如果你想了解我对Java的了解程度,可以参考一下我是高中生即将毕业的学生。 - John
@Siddhartha 在我看来,他理解了这个问题。他有一个类似于 LinkedList<TeamDescription> 的东西,其中 TeamDescription 是一个包含 Stringint 的类。 - Bartosz Przybylski
@Siddhartha,这可能是自定义对象的列表,我们不确定。他没有展示任何代码。我猜测这是“一个包含有String名称和int分数值的对象LinkedList”。 - YoungHobbit
显示剩余3条评论
3个回答

9

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}]

3

除了其他答案,这里有一个简洁的Java 8解决方案:

Collections.sort(list, Comparator.comparingInt(obj -> obj.score).reversed());
< p > reversed() 方法是用于降序排列,它按照 obj.score 进行比较。

< p > 如 Iaune 所指出的,如果正确使用封装obj -> obj.score 可以被替换为 ObjType::getScore


1
可能是obj.getScore()或者WhateverTheClassIsCalled::getScore,假设这些字段不是公共的 - 他们不应该是公共的;-)。这个优美的定义加1分。 - laune
@Downvoter,请留下评论解释一下我回答的问题,这样我就可以修复它。 - bcsb1001
不是我,但请看我的评论。 - laune

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;
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接