可能重复:< 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);
}
}
如果我想根据学生的名字对学生列表进行排序
你可能想要这样的东西:
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());
}
}
);
这将首先按姓名对学生进行排序。如果姓名缺失,或者两个学生同名,则按年龄排序。
这可能是最简单方法
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);
基于您现有的学生类,这是我通常的做法,尤其是当我需要多个比较器时。
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。然后使用设置链中的下一个比较器。比较器在此链中出现的越早,就越“重要”。 编辑: 另请参阅