Comparator与Comparable接口实现对象排序

Arrays.sort方法可以实现对基本类型的元素进行排序,但对于非基本类型,Java中常通过重载compareTo方法自定义排序方式

Comparable & Comparator 接口都可用来实现集合元素的比较、排序,其中Comparable通过集合内部定义的方法实现排序,Comparator 通过外部自定义比较器实现排序。排序时,可采用实现集合内部Comparable接口和自定义外部比较器两种方式。

案例描述:

       输入若干个学生信息,每个学生具有姓名(stuName),学号(stuId),成绩(score)等属性,输入后按成绩降序排列,若成绩相同,按学号升序排列

测试代码:

 1 package edu.fjnu.test;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Arrays;
 5 import java.util.Collections;
 6 import java.util.List;
 7 import java.util.Scanner;
 8 
 9 public class Tester {
10 
11     public static void main(String[] args) {
12         // TODO Auto-generated method stub
13 
14         List<Student> stuList = new ArrayList<Student>();
15 
16         int stuNumber;// 学生数
17 
18         Scanner cin = new Scanner(System.in);
19 
20         stuNumber = cin.nextInt();// 输入学生人数
21 
22         for (int i = 1; i <= stuNumber; i++) {// 录入学生信息
23 
24             Student stu = new Student();
25             int score, num;
26             String name = null;
27             
28             num = cin.nextInt();// 学号
29             score = cin.nextInt();// 分数
30             name = cin.nextLine();// 姓名
31 
32             stu.setStuId(num);
33             stu.setScore(score);
34             stu.setStuName(name);
35 
36             stuList.add(stu);// 加入stuList
37 
38         }
39         Collections.sort(stuList, new StudentComparator());// 一 实现Comparable接口
40         Collections.sort(stuList);// 自定义比较器,实现Comparator接口
41 
42         for (Student stu : stuList)
43             System.out.println(stu);
44 
45     }
46 
47 }

一 实现Comparable接口

package edu.fjnu.test;

import java.util.Comparator;

public class StudentComparator implements Comparator {

    @Override
    public int compare(Object o1, Object o2) {//自定义集合元素比较方式
        // TODO Auto-generated method stub

        Student s1 = (Student) o1;
        Student s2 = (Student) o2;

        if (s1.getScore() < s2.getScore())// 先按分数降序排序
            return 1;
        else if (s1.getScore() == s2.getScore())
            return s1.getStuId().compareTo(s2.getStuId());// 分数相同按学号升序排序
        return -1;
    }

}

测试结果1:

 

二 自定义比较器,实现Comparator接口

package edu.fjnu.test;

import java.util.Comparator;

public class Student implements Comparable {

    Integer stuId;// 学号
    String stuName;// 姓名
    Integer score;// 分数

    public Integer getStuId() {
        return stuId;
    }

    public void setStuId(Integer stuId) {
        this.stuId = stuId;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public Integer getScore() {
        return score;
    }

    public void setScore(Integer score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "学号:" + stuId + "\t姓名:" + stuName + "\t分数:" + score;
    }

    @Override
    public int compareTo(Object o) {

        Student s = (Student) o;
        if (this.getScore() < s.getScore())// 先按分数降序排列
            return 1;
        else if (this.getScore() == s.getScore())// 分数相同则按学号升序排列
            return this.getStuId() - s.getStuId();
        return -1;
    }

}

 测试结果2:

 

posted @ 2016-01-25 14:02  One160701  阅读(771)  评论(0编辑  收藏  举报