您的位置:首页 > 其它

Comparator与Comparable接口实现对象排序

2016-01-25 14:02 369 查看
Arrays.sort方法可以实现对基本类型的元素进行排序,但对于非基本类型,Java中常通过重载compareTo方法自定义排序方式

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

案例描述:

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

测试代码:

package edu.fjnu.test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Tester {

public static void main(String[] args) {
// TODO Auto-generated method stub

List<Student> stuList = new ArrayList<Student>();

int stuNumber;// 学生数

Scanner cin = new Scanner(System.in);

stuNumber = cin.nextInt();// 输入学生人数

for (int i = 1; i <= stuNumber; i++) {// 录入学生信息

Student stu = new Student();
int score, num;
String name = null;

num = cin.nextInt();// 学号
score = cin.nextInt();// 分数
name = cin.nextLine();// 姓名

stu.setStuId(num);
stu.setScore(score);
stu.setStuName(name);

stuList.add(stu);// 加入stuList

}
Collections.sort(stuList, new StudentComparator());// 一 实现Comparable接口
Collections.sort(stuList);// 自定义比较器,实现Comparator接口

for (Student stu : stuList)
System.out.println(stu);

}

}


一 实现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:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: