比较器排序Comparator和Comparable的使用
简述Comparable和Comparator两个接口的区别。
compare是comparator里面的一个方法
Comparable:强行对实现它的每个类的对象进行整体排序。
这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。
只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。
实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。Comparator强行对某个对象进行整体排序。
可以将Comparator 传递给sort方法(如Collections.sort或Arrays.sort),从而允许在排序顺序上实现精确控制。
还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序
Int排序
@Test
public void test1(){
List<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 57,112,35,5);
System.out.println(list);
//排序方法
Collections.sort(list);
System.out.println(list);
}
/*
[57, 112, 35, 5]
[5, 35, 57, 112]
*/
String排序
public int compare(String o1, String o2) :比较其两个参数的顺序。
两个对象比较的结果有三种:大于,等于,小于。
如果要按照升序排序, 则o1 小于o2,返回(负数),相等返回0,01大于02返回(正数)
如果要按照降序排序 则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数)
@Test
public void test1(){
List<String> list = new ArrayList<String>();
list.add("cba");
list.add("aba");
list.add("bcd");
list.add("nad");
System.out.println(list);
//排序方法
Collections.sort(list, new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
return o2.charAt(0) - o1.charAt(0);
}
});
System.out.println(list);
}
/*
[cba, aba, bcd, nad]
[nad, cba, bcd, aba]
*/
对象排序
案例
需求说明:
根据学生年龄,找出班级中年龄最大与年龄最小的学生信息。
思路提示:
1、将学生类实现Comparable接口
2、重写compareTo方法,按照年龄进行比较
3、创建List集合并存储学生对象实例
4、调用max方法和min方法得到年龄最大与年龄最小的学生信息输出。
如果想要集合中的元素完成排序,那么必须要实现比较器Comparable接口。如果是对象的话,sort不能直接排序,需要在类那里实现Comparable<T>,然后重写compareTo方法
—学生类
package Day0817am;
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student() {
}
public Student(String name, int age){
super();
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Student o) {
//按照当前的类作为参照对象,与方法中传入的参数进行对比
//如果返回值是正数,则表示大,为负数否则表示小,为0表示相等
if(this.age>o.getAge()){
return 1;
}else if(this.age < o.getAge()){
return -1;
}else{
return 0;
}
}
}
—测试类
@Test
public void test2(){
//实例化学生对象
Student stu1 = new Student("张三1",18);
Student stu2 = new Student("张三2",88);
Student stu3 = new Student("张三3",78);
Student stu4 = new Student("张三4",28);
Student stu5 = new Student("张三5",8);
List<Student> stus = new ArrayList<Student>();
stus.add(stu1);
stus.add(stu2);
stus.add(stu3);
stus.add(stu4);
stus.add(stu5);
System.out.println("---------排序前----------");
for(Student s : stus){
System.out.println(s);
}
System.out.println("-----------排序后----------");
Collections.sort(stus);
for(Student s : stus){
System.out.println(s);
}
System.out.println("年龄最大的学生为:"+Collections.max(stus));
System.out.println("年龄最小的学生为:"+Collections.min(stus));
}
/*
---------排序前----------
Student [name=张三1, age=18]
Student [name=张三2, age=88]
Student [name=张三3, age=78]
Student [name=张三4, age=28]
Student [name=张三5, age=8]
-----------排序后----------
Student [name=张三5, age=8]
Student [name=张三1, age=18]
Student [name=张三4, age=28]
Student [name=张三3, age=78]
Student [name=张三2, age=88]
年龄最大的学生为:Student [name=张三2, age=88]
年龄最小的学生为:Student [name=张三5, age=8]
*/
如果在使用的时候,想要独立的定义规则去使用 可以采用Collections.sort(List list,Comparetor c)方式,自己定义规则:
Collections.sort(stus, new Comparator<Student>(){
@Override
public int compare(Student o1, Student o2) {
//年龄降序
result o2.getAge()-o1.getAge();
}
});
扩展
o2 - o1 :降序
o1 - o2 :升序
Collections.sort(stus, new Comparator<Student>(){
@Override
public int compare(Student o1, Student o2) {
//年龄降序
int result = o2.getAge()-o1.getAge();
//如果年龄一样,就按照名字首字母升序排序
if(result == 0){//第一个规则判断完了?下一个规则?姓名的首字母?升序
result = o1.getName().charAt(0)-o2.getName().charAt(0);
}
return result;
}
});
@Test
public void test1(){
//实例化学生对象
Student stu1 = new Student("张三1",18);
Student stu2 = new Student("李三2",88);
Student stu3 = new Student("王三3",18);
Student stu4 = new Student("张三4",28);
Student stu5 = new Student("张三5",8);
List<Student> stus = new ArrayList<Student>();
stus.add(stu1);
stus.add(stu2);
stus.add(stu3);
stus.add(stu4);
stus.add(stu5);
System.out.println("---------排序前----------");
for(Student s : stus){
System.out.println(s);
}
System.out.println("-----------排序后----------");
Collections.sort(stus, new Comparator<Student>(){
@Override
public int compare(Student o1, Student o2) {
//年龄降序
int result = o2.getAge()-o1.getAge();
//如果年龄一样,就按照名字首字母升序排序
if(result == 0){//第一个规则判断完了 下一个规则 姓名的首字母 升序
result = o1.getName().charAt(0)-o2.getName().charAt(0);
}
return result;
}
});
for(Student s : stus){
System.out.println(s);
}
}
/*
---------排序前----------
Student [name=张三1, age=18]
Student [name=李三2, age=88]
Student [name=王三3, age=18]
Student [name=张三4, age=28]
Student [name=张三5, age=8]
-----------排序后----------
Student [name=李三2, age=88]
Student [name=张三4, age=28]
Student [name=张三1, age=18]
Student [name=王三3, age=18]
Student [name=张三5, age=8]
*/