当前位置: 首页 > 知识库问答 >
问题:

集合排序(列表< T >,比较器)方法示例[重复]

杨成礼
2023-03-14

可能重复:< br >使用多个键对Java对象排序

我找不到任何使用此方法的示例,所有示例都给出了第二个参数“null”。我听说这个方法用于根据一个以上的标准对类进行排序,但没有找到任何示例。

public class Student implements Comparable<Student> {
String name;
int age;

public Student(String name, int age) {
    this.name = name;
    this.age = age;
}

@Override
public String toString() {
    return name + ":" + age;
}

@Override
public int compareTo(Student o) {
    Integer myAge = age;
    Integer oAge = o.age;
    return myAge.compareTo(oAge);
}

}

如果我想根据学生的名字对学生列表进行排序

共有3个答案

胡沈义
2023-03-14

你可能想要这样的东西:

Collections.sort(students, new Comparator<Student>() {
                     public int compare(Student s1, Student s2) {
                           if(s1.getName() != null && s2.getName() != null && s1.getName().comareTo(s1.getName()) != 0) {
                               return s1.getName().compareTo(s2.getName());
                           } else {
                             return s1.getAge().compareTo(s2.getAge());
                          }
                      }
);

这将首先按姓名对学生进行排序。如果姓名缺失,或者两个学生同名,则按年龄排序。

钱锦
2023-03-14

这可能是最简单方法

Collections.sort(listOfStudent,new Comparator<Student>(){
                     public int compare(Student s1,Student s2){
                           // Write your logic here.
                     }});

使用 Java 8(lambda 表达式) -

listOfStudent.sort((s1, s2) -> s1.age - s2.age); 
上官修文
2023-03-14

基于您现有的学生类,这是我通常的做法,尤其是当我需要多个比较器时。

public class Student implements Comparable<Student> {

    String name;
    int age;

    public Student(String name, int age) {
       this.name = name;
       this.age = age;
    }

    @Override
    public String toString() {
        return name + ":" + age;
    }

    @Override
    public int compareTo(Student o) {
        return Comparators.NAME.compare(this, o);
    }


    public static class Comparators {

        public static Comparator<Student> NAME = new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.name.compareTo(o2.name);
            }
        };
        public static Comparator<Student> AGE = new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.age - o2.age;
            }
        };
        public static Comparator<Student> NAMEANDAGE = new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int i = o1.name.compareTo(o2.name);
                if (i == 0) {
                    i = o1.age - o2.age;
                }
                return i;
            }
        };
    }
}

用法:

List<Student> studentList = new LinkedList<>();
Collections.sort(studentList, Student.Comparators.AGE);

编辑

自从 Java 8 发布以来,使用 lambda 可以大大简化内部类比较器。Java 8 还为比较器对象 subsetComparing 引入了一种新方法,它消除了在嵌套每个比较器时对它们进行手动检查的需要。下面是学生比较器类的 Java 8 实现,其中考虑了这些更改。

public static class Comparators {
    public static final Comparator<Student> NAME = (Student o1, Student o2) -> o1.name.compareTo(o2.name);
    public static final Comparator<Student> AGE = (Student o1, Student o2) -> Integer.compare(o1.age, o2.age);
    public static final Comparator<Student> NAMEANDAGE = (Student o1, Student o2) -> NAME.thenComparing(AGE).compare(o1, o2);
}
 类似资料:
  • 我试图按价格对项目进行排序,但每个项目都属于一个类别,因此我必须创建一个以类别为键、以项目为值的地图,并且我必须使用class对其进行排序。 这是比较器类 这就是地图 我不知道如何在这张地图上按价格对物品进行分类。

  • 这种异常的原因是什么: 我使用的比较器如下: 其中 parameter.getSomeValue: 在: 哪里: 我不能重现这个异常,但它有时会出现。此外,您能给出100%出现此问题的代码示例吗?

  • 我有以下课程:

  • 我知道它已经被询问和回答了数百万次,但我仍然无法弄清楚为什么我在排序期间收到了违规。这是我的代码: 我收到了这个错误 有什么想法吗?

  • 我有一个程序有很多数据对象。每种方法都实现了可比性,并设置为从最高到最低(基于简单的长值)排序,包括重复的值。我希望这些对象存储在一个集合/列表中,这样我就可以遍历它,并在其各自的位置取出每个对象。 我已经研究过使用树集,但是这不允许重复,因此只保留具有相同值的多个对象中的一个。然后我找到了TreeMultiset,它可以保持元素具有相同的值。唯一的问题是,它只是存储同一对象的副本,而不是多个相等

  • 问题内容: 是否有Java开源比较器可以按多个字段比较bean以进行多列排序?每列可以按升序或降序排序。 对于单列排序,可以与一起使用。 我知道编写此功能非常简单,但是如果已经编写并测试过轮子,那么重新发明轮子有什么好处? 问题答案: 我是几个月前写的。 只需从此类继承并重写doCompare-Method。然后使用设置链中的下一个比较器。比较器在此链中出现的越早,就越“重要”。 编辑: 另请参阅