1.Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。
(作用在实体类上)
编写实体类
//实现Comparable接口,泛型为House类
public class House implements Comparable<House> {
private double area;//面积
private double money;//房价
//重写Comparable的方法
@Override
public int compareTo(House o) {
//因为返回值是int类型,而参与比较的房价为double类型,
//所以要用Double包装类比较,返回的是一个int类型
return Double.compare(this.money,o.money);
}
//重写toString方法,用来打印
@Override
public String toString() {
return "House{" +
"area=" + area +
", money=" + money +
'}';
}
public House() {
}
public House(double area, double money) {
this.area = area;
this.money = money;
}
}
编写测试类
public class TestHouse {
public static void main(String[] args) {
//初始化数据
House[] houses ={
new House(80,90),
new House(100,200),
new House(60,150),
new House(110,120),
new House(90,100),
new House(70,190)
};
//对对象数组进行排序,sort排序会自动调用 public int compareTo(House o)方法比较
Arrays.sort(houses);
//调用重写的toString方法,进行打印
System.out.println(Arrays.toString(houses));
}
}
运行效果图
2.而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
(作用在排序类上)。
实体类狗
public class Dog {
private String name;//狗名
private int age;//年龄
//重写toString方法方便打印
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public Dog() {
}
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
}
编写Comparator比较器
//实现Comparator接口,泛型为Dog
public class TorDog implements Comparator<Dog> {
//重写compare方法
@Override
public int compare(Dog o1, Dog o2) {
//比较狗名字符串的大小
return o1.getName().compareTo(o2.getName());
}
}
测试类
public class TestDog {
public static void main(String[] args) {
//初始化数据
Dog[] dogs = {
new Dog("旺财",2),
new Dog("来福",5),
new Dog("大黄",3),
new Dog("小黑",4),
new Dog("哮天犬",6)
};
//升序排列
char a ='啸',b='大';
//打印字符所对应的十进制数
System.out.println((int)a);
System.out.println((int)b);
//传值比较
Arrays.sort(dogs,new TorDog());
System.out.println(Arrays.toString(dogs));
}
}
运行效果
总结:Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。