申明:本篇博客仅用作学习用途,记录老师上课所提到的两类比较器
目录
一、内部比较器
java.lang.Comparable <T> 接口声明了:int compareTo(T o) 方法。此方法可以为自定义类添加可比较属性。
实现了Comparable接口后,就意味着“该类支持排序”。假设现在存在“实现了Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过Collections.sort(或Arrays.sort)进行排序。
Comparable的定义:
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
实现了内部比较器的类需要重写compareTo方法,保证类支持排序。
- Java的一些常用类已经实现了Comparable接口,并提供了比较大小的标准,Integer,Long,Double等包装类按照它们对应的数值的大小进行比较,Character,Boolean,String,Data,Time等也都实现了Comparable接口。
package first_project;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Students implements Comparable<Students> {
private int age;
private String name;
//与类同名的是构造方法
public Students(int age, String name) {
this.age = age;
this.name = name;
}
public Students() {
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public int compareTo(Students s1){
if (this.getAge()>s1.getAge()){
return 1;
}else if (this.getAge()==s1.getAge()){
return 0;
}else{
return -1;
}
}
@Override
public String toString(){
return "Name:" + name +",Age:"+age;
}
}
public class TestCompare{
public static void main(String[] args){
List<Students> arr = new ArrayList<>();
arr.add(new Students(20,"mark"));
arr.add(new Students(22,"kaven"));
arr.add(new Students(16,"daxia"));
arr.add(new Students(25,"handoking"));
Collections.sort(arr);
System.out.println(arr.get(0).toString());
}
}
排序结果如图所示:
二、外部比较器
若是想要对某个类的对象集合进行排序,而该类本身不支持排序(即没有实现Comparable接口);那么可以建立一个“该类的比较器”来对这个类的对象进行排序,这个“比较器”只需要实现Comparator接口即可。
Comparator的定义:
package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
- 若一个类要实现Comparator接口,则一定要实现compare(T o1,T o2)函数,但可以不实现equals(Object obj)函数。Object类是所有类的父类,即实现接口的子类已经重写了equals方法。
package first_project;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
//外部比较器
class MyCompare implements Comparator<Students_1> {
@Override
public int compare(Students_1 s1,Students_1 s2){
if (s1.getAge()>s2.getAge()){
return 1;
}else if (s1.getAge()==s2.getAge()){
return 0;
}else{
return -1;
}
}
}
class Students_1{
private int age;
private String name;
public Students_1(int age, String name) {
this.age = age;
this.name = name;
}
public Students_1() {
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString(){
return "Name:"+name+",Age:"+age;
}
}
public class TestCompare_1{
public static void main(String[] args){
List<Students_1> arr = new ArrayList<>();
arr.add(new Students_1(20,"mark"));
arr.add(new Students_1(22,"kaven"));
arr.add(new Students_1(16,"daxia"));
arr.add(new Students_1(25,"handoking"));
Collections.sort(arr,new MyCompare());
System.out.println(arr.get(3).toString());
}
}
排序的结果如下图所示:
三、最后总结
- Comparable 是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。
- Comparator是比较器;若需要控制某个类的对象集合的次序,可以自定义一个“该类的对象的比较器”来进行排序。