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: