我有像这样的POJO班学生
class Student
{
private int score;
private String FirstName;
//Getters and setters .................
}
我正在创建像这样的ArrayList
public static void main(String[] args)
{
List<Student> al_students= new ArrayList<Student>();
Student s1= new Student();
s1.setScore(90);
s1.setFirstName("abc");
al_students.add(s1);
Student s2= new Student();
s2.setScore(95);
s2.setFirstName("def");
al_students.add(s2);
Student s3= new Student();
s3.setScore(85);
s3.setFirstName("xyz");
al_students.add(s3);
}
现在我想根据分数降序排序,即 输出
1)def 95
2)abc 90
3)xyz 85
答案 0 :(得分:9)
使用Comparator:
Collections.sort(al_students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return Integer.compare(o2.getScore(), o1.getScore());
}
});
或者,让Student实施Comparable界面:
class Student implements Comparable<Student> {
...
@Override
public int compareTo(Student s) {
return Integer.compare(s.getScore(), getScore());
}
}
然后你可以在没有比较器的情况下进行排序:
Collections.sort(al_students);
答案 1 :(得分:9)
您可以使用自定义Comparator
。
这是一个完整的示例(排除了导入):
public class Main {
// main method setting up and printing students
public static void main(String[] args) {
List<Student> students = new ArrayList<Student>();
Student s1 = new Student();
s1.setScore(90);
s1.setFirstName("abc");
students.add(s1);
Student s2 = new Student();
s2.setScore(95);
s2.setFirstName("def");
students.add(s2);
Student s3 = new Student();
s3.setScore(85);
s3.setFirstName("xyz");
students.add(s1);
System.out.printf("Unordered: %s%n", students);
// sorting using anonymous Comparator
Collections.sort(students, new Comparator<Student>() {
public int compare(Student s1, Student s2) {
// notice the cast to (Integer) to invoke compareTo
return ((Integer)s1.getScore()).compareTo(s2.getScore());
}
});
System.out.printf("Ordered: %s%n", students);
}
// Student class
static class Student {
private int score;
private String firstName;
// boring stuff
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String name) {
this.firstName = name;
}
// for printing
@Override
public String toString() {
return String.format("Student \"%s\" with score: %d%n", firstName,
score);
}
}
}
<强>输出强>
Unordered: [Student "abc" with score: 90
, Student "def" with score: 95
, Student "abc" with score: 90
]
Ordered: [Student "abc" with score: 90
, Student "abc" with score: 90
, Student "def" with score: 95
]
注意强>
正如其他人所说,如果唯一(或默认)排序将按分数排序,您也可以在implement Comparable<Student>
课程中Student
。
第二次修改
要按递减顺序排序,您可以使用以下内容替换return
中的Comparator
语句:
return ((Integer)s2.getScore()).compareTo(s1.getScore());
感谢programminglover因错误拒绝编辑而发现此/道歉!
答案 2 :(得分:4)
如果您使用的是Java 8,那么您的代码可能看起来像
al_students.sort(Comparator.comparingInt(Student::getScore).reversed());
答案 3 :(得分:0)
您可以编写自定义Comparator来解决此问题。
答案 4 :(得分:0)
请参阅,有这个逻辑。
学生是你创造的课程。如果您想允许其他类根据您自己的要求对自定义对象进行排序,您应该告诉它。如果您实现Comparable或Comparator接口并在自定义类中重写这些方法,并且在那些方法中指定了您将要比较的方式,那将会发生。
答案 5 :(得分:0)
其他人几乎回答了整个问题......
由于有2个选项,要么使用Comparable接口,要么使用Comparator接口, 我希望您转到this post解释何时使用Comparable以及何时使用Comparator。
这对你真的很有帮助。