【问题标题】:Sort a LinkedList of objects by object's variable [duplicate]按对象的变量对对象的LinkedList进行排序[重复]
【发布时间】:2016-01-16 08:50:03
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你的意思是你有一个LinkedHashMap? LinkedList 没有 K、V 对。
  • Collections.sort 有一个可以传递比较器的版本。 docs.oracle.com/javase/7/docs/api/java/util/…
  • 我不(?)这将是我第一次对列表进行排序,因为之前我使用的是数组,所以我是新手。高中生,如果能提供任何参考,我对 Java 了解多少
  • 确保您了解ListMapSet 之间的区别。您描述的是一个Map,其中包含一个Key(字符串名称)和一个对应的Value(整数分数)。
  • @Siddhartha IMO 他明白他有类似LinkedList<TeamDescription> 的东西,其中TeamDescriptionStringint 的类

标签: java list sorting object


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    除了其他答案之外,还有一个简洁的 Java 8 解决方案:

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

    reversed() 用于降序排列,这与obj.score 进行比较。

    正如 Iaune 所说,如果您正确使用 Encapsulationobj -&gt; obj.score 可以替换为 ObjType::getScore

    【讨论】:

    • 可能是 obj.getScore() 或 WhatTheClassIsCalled::getScore,假设这些字段不是公开的——它们不应该是 ;-)。为这个简洁的定义 +1。
    • @Downvoter,请留下评论,用我的答案解释问题,以便我解决。
    • 不是我,但请看我的评论。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2012-01-17
      • 1970-01-01
      • 2016-11-25
      • 2011-07-07
      • 2021-01-25
      相关资源
      最近更新 更多