记得当初面试的时候遇见过一道类似这样的题,给出几个学生的成绩和年龄让根据学生的成绩进行排序,如果成绩相同则根据学生的年龄进行排序。当时傻乎乎的不知道咋整,直接根据成绩排了一下序就给输出了,最近看java基础比较器的时候才明白这道题的意思是考java基础中的比较器。
方法一、
通过实现Comparable接口进行排序,这个方法需要重写comparable接口的compareTo方法,再我们常用的许多类都实现了这个接口,如Float,Double,BigDecimal,Date等。compareTo方法的返回值有三种,即-1、0、1分别表示小于、等于、大于。
public class Student implements Comparable<Student>{ private String name; private int age; private float score; public Student(String name,int age,float score){ this.name=name; this.age=age; this.score=score; } public String toString(){ return name+"\t\t"+age+"\t\t"+score; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public float getScore() { return score; } public void setScore(float score) { this.score = score; } @Override /* * 重写compareTo方法 */ public int compareTo(Student stu) { // TODO Auto-generated method stub if(this.score>stu.score){ //判断成绩 return -1; }else if(this.score<stu.score){ return 1; }else{ if(this.age>stu.age){//判断年龄 return -1; }else if(this.age<stu.age){ return 1; }else{ return 0; } } } }
package com.compareable; import java.util.Arrays; public class CompareableDemo1 { public static void main(String[] args) { Student s1 = new Student("李寻欢", 32, 93); Student s2 = new Student("展雄飞", 24, 98); Student s3 = new Student("叶开", 22, 91); Student s4 = new Student("傅红雪", 22, 95); Student s5 = new Student("阿飞", 24, 91); Student []stu={s1,s2,s3,s4,s5}; Arrays.sort(stu); //对stu数组进行排序 for (Student student : stu) { System.out.println(student); } } }
方法二、
通过实现Comparator接口实现排序,在上边的排序过程中Student类需要实现Comparable接口,但是如果我们即想排序而又不想动Student类时方法一就不好使了,这时候我们可以使用Comparator接口来指定我们的排序规则。
package com.compareable; public class Student1 { private String name; private int age; private float score; public Student1(String name,int age,float score){ this.name=name; this.age=age; this.score=score; } public String toString(){ return name+"\t\t"+age+"\t\t"+score; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public float getScore() { return score; } public void setScore(float score) { this.score = score; } }
package com.compareable;
import java.util.Comparator;
/**
*
* 排序规则
*
*/
class StudentComparator implements Comparator<Student1>{
@Override
public int compare(Student1 stu1, Student1 stu2) {
// TODO Auto-generated method stub
if(stu1.equals(stu2)){
return 0;
}else if(stu1.getScore()>stu2.getScore()){
return -1;
}else if(stu1.getScore()<stu2.getScore()){
return 1;
}else{
if(stu1.getAge()>stu2.getAge()){
return 1;
}else {
return 0;
}
}
}
}
package com.compareable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class ComparatorDemo1 {
public static void main(String[] args) {
Student1 s1 = new Student1("李寻欢", 32, 93);
Student1 s2 = new Student1("展雄飞", 24, 98);
Student1 s3 = new Student1("叶开", 22, 91);
Student1 s4 = new Student1("傅红雪", 22, 95);
Student1 s5 = new Student1("阿飞", 24, 91);
Student1 [] stu1={s1,s2,s3,s4,s5};
Arrays.sort(stu1, new StudentComparator());//使用sort方法进行排序
for(Student1 s:stu1){
System.out.println(s);
}
}
}