如何在java中对由pojo类组成的Arraylist进行排序

时间:2015-06-04 11:26:54

标签: java sorting arraylist

我有像这样的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

6 个答案:

答案 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。

这对你真的很有帮助。