1、Comparable接口和Comparator接口的比较比较:
(1)比较:Comparable接口和Comparator接口将其实现后都可以控制类的次序(对类排序)。Comparable接口相当于内部比较器,而Comparator接口这相当于外部比较器,使用Comparable接口使类可排序比较简单,但扩展性没有Comparator接口好,Comparator接口可以通过编写多个不同的实现类来实现无需修改源代码就可实现依据类的不同特征来实现各种排序不同的排序。
(2)排序时的使用方式:
①Comparable接口:
调用的方法:
//Collections类的一个静态方法
public static <T extends Comparable<? super T>> void sort(List<T> list)
具体调用方式:
//lis是List接口的实现类
//并且list中的元素对应的类实现了Comparable接口
Collections.sort(list);//排序
②Comparator接口:
调用的方法:
//Collections类的一个静态方法
public static <T> void sort(List<T> list, Comparator<? super T> c)
具体调用方式:
//lis是List接口的实现类
//MyComparator是对Comparator接口的具体实现,定义了list中元素的排序方式
Collections.sort(list,new MyComparator());//排序
2、Comparable接口的使用:
Circle类:
public class Circle implements Comparable<Circle>{
private double radius;//圆的半径
public static double PI=3.14;
public Circle(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
/**
* 圆的面积
* @return
*/
public double getArea(){
double result=PI*radius*radius;
return result;
}
/**
* 圆的面积
* @return
*/
public double perimeter(){
double result=2*PI*radius;
return result;
}
/**
* 实现比较的方法
* @param circle
* @return
*/
@Override
public int compareTo(Circle circle) {
return Double.compare(this.radius,circle.radius);
}
@Override
public String toString() {
return "Circle{" +
"radius=" + radius +
'}';
}
}
测试类Test:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Circle> list=new ArrayList<>();
Circle[] circles=new Circle[5];
circles[0]=new Circle(3);
circles[1]=new Circle(2);
circles[2]=new Circle(4);
circles[3]=new Circle(1);
circles[4]=new Circle(5);
for (int i = 0; i <circles.length; i++) {
list.add(circles[i]);
}
System.out.println("排序前:"+list);
Collections.sort(list);//排序
System.out.println("排序后:"+list);
}
}
3、Comparator接口的使用
Circle类:
public class Circle {
private double radius;//圆的半径
public static double PI=3.14;
public Circle(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
/**
* 圆的面积
* @return
*/
public double getArea(){
double result=PI*radius*radius;
return result;
}
/**
* 圆的面积
* @return
*/
public double perimeter(){
double result=2*PI*radius;
return result;
}
@Override
public String toString() {
return "Circle{" +
"radius=" + radius +
'}';
}
}
CircleComparator类(实现了Comparator接口)
import java.util.Comparator;
/**
* 实现圆的比较器
*/
public class CircleComparator implements Comparator<Circle> {
@Override
public int compare(Circle circle1, Circle circle2) {
return Double.compare(circle1.getRadius(),circle2.getRadius());
}
}
测试类Test:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Circle> list=new ArrayList<>();
Circle[] circles=new Circle[5];
circles[0]=new Circle(3);
circles[1]=new Circle(2);
circles[2]=new Circle(4);
circles[3]=new Circle(1);
circles[4]=new Circle(5);
for (int i = 0; i <circles.length; i++) {
list.add(circles[i]);
}
System.out.println("排序前:"+list);
Collections.sort(list,new CircleComparator());//排序
System.out.println("排序后:"+list);
}
}