比较器
Java语言中的比较器分为两种:
Comparable比较器:Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。(作用在实体类上)同时也被称之为:内部比较器。
Comparator比较器:我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。(作用在排序类上)同时也被称之为:外部比较器。
案例 1 内部比较器:
先创建一个类:
public class House implements Comparable<House>{
//房子的面积及总价
private int area;
private int money;
public House() {
}
public House(int area, int money) {
this.area = area;
this.money = money;
}
@Override//自定义比较规则:按照面积比大小 (负数 0 正数)
public int compareTo(House o) {
return this.getArea()-o.getArea();
}
@Override
public String toString() {
return "House{" +
"area=" + area +
", money=" + money +
'}';
}
public int getArea() {
return area;
}
public void setArea(int area) {
this.area = area;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
创建测试类:
public class TestHouse {
public static void main(String[] args) {
House h1 = new House(90, 1000000);
House h2 = new House(100, 1500000);
House h3 = new House(50, 500000);
House h4 = new House(80, 2000000);
House h5 = new House(70, 1600000);
House[] houses={h1,h2,h3,h4,h5};
System.out.println("排序前!");
System.out.println(Arrays.toString(houses));
System.out.println("排序后!");
//给对象排序时,需要实体类实现 Comparable 接口,才可以实现排序
Arrays.sort(houses);
System.out.println(Arrays.toString(houses));
}
}
输出的结构为:
排序前!
[ 面积=90 价格=1000000 , 面积=100 价格=1500000 , 面积=50 价格=500000 , 面积=80 价格=2000000 , 面积=70 价格=1600000 ]
排序后!
[ 面积=50 价格=500000 , 面积=70 价格=1600000 , 面积=80 价格=2000000 , 面积=90 价格=1000000 , 面积=100 价格=1500000 ]
因此可以看出排序依据按照我们定义的规则完成!!!
案例 2 外部比较器:
先创建一个任意类来进行我们的操作:
public class Dog {
private String name;
private int age;
@Override
public String toString() {
return
"名字=" + name +
"年龄=" + age;
}
public Dog() {
}
public Dog(String name, int age) {
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;
}
}
再创建一个外部比较器类继承 Comparator 接口并写 compare 方法:
public class CompareDog implements Comparator<Dog> {
@Override
public int compare(Dog o1, Dog o2) {
//return o1.getAge()-o2.getAge();根据年龄排序
//把每个字符变成int类型后再进行比较
return o1.getName().compareTo(o2.getName());//根据名字排序
}
}
最后创建测试类测试:
public class TestDog {
public static void main(String[] args) {
Dog[]dogs={
new Dog("菲菲",5),
new Dog("前前",9),
new Dog("嘿嘿",1),
new Dog("蕾蕾",6),
new Dog("牛牛",4)
};
System.out.println("排序前:");
System.out.println(Arrays.toString(dogs));
System.out.println("排序后:");
Arrays.sort(dogs,new CompareDog());
System.out.println(Arrays.toString(dogs));
}
}
运行结果为:
排序前:
[ 名字=菲菲 年龄=5 , 名字=前前 年龄=9 , 名字=嘿嘿 年龄=1 , 名字=蕾蕾 年龄=6 , 名字=牛牛 年龄=4 ]
排序后:
[ 名字=嘿嘿 年龄=1 , 名字=牛牛 年龄=4 , 名字=菲菲 年龄=5 , 名字=蕾蕾 年龄=6 , 名字=前前 年龄=9 ]
因此可以看出排序依据按照我们定义的规则完成!!!
当然名字也可以排序,按照汉字的排序规则排序!