比较器简单应用
Comparable和Comparator的简单使用:
如果对象数组需要排序,那么就必须设置排序规则,就要使用这两种比较器
- 对于Comparable接口来说,它往往是进行比较类需要实现的接口,它仅包含一个有compareTo()方法,只有一个参数,返回值为int,返回值大于0表示对象大于参数对象;小于0表示对象小于参数对象;等于0表示两者相等,Comparable接口一般用于我们自己写的类或者是是可以实现接口的对象类中。
- 对于Comparator接口来说,它的实现者被称为比较器,它包含一个compare()方法,有两个参数,返回值与Comparable的compareTo()方法一样,不同之处是Comparator接口一般不会被集合元素类所实现,而是单独实现或者匿名内部类方式实现,Comparator接口一般用于系统自己的类中,我们不能随意的继承接口和复写方法。
实例:
文件结构:
- Person.java为我们自己的类实现Comparable接口复写CompareTo方法;
- Dog.java假定为系统的类不能随意实现接口和复写方法;
- MyCompare.java为Comparator接口的类,并且复写Compare方法;
- Test1.java为主方法。
Person.java
public class Person implements Comparable<Person>{//加入了泛型(<Person>)
//自己写的类,可以实现接口,所以用Comparable接口复写compareTo方法实现比较
public String name;
public int age;
public Person(String name,int age){
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Person o) {//加入泛型后,不需要对object类进行强转为person类
if(this.age > o.age){
return 1;
}
if(this.age < o.age){
return -1;
}
return name.compareTo(o.name);//调用了javaLong包关于string的compareable的比较
}
// @Override
// public int compareTo(Object o) {// 加入泛型前 //比较器接口
// /*
// 比较器规则
// 如果返回正整数 则表示调用对象要大于参数对象
// 如果返回负整数 则表示调用对象要小于参数对象
// 如果返回0 则表示调用对象等于参数对象
// */
// Person person = (Person)o;//强制转换将object类强转成为person类
// if(this.age > person.age){
// return 1;
// }
// if(this.age < person.age){
// return -1;
// }
// return name.compareTo(person.name);//调用了javaLong包关于string的compareable的比较
// }
}
Dog.java
public class Dog {//当做是系统的类不可以随意实现接口
//用Comparator接口复写compare方法实现比较
public String name;
public int age;
public Dog(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Dog [name=" + name + ", age=" + age + "]";
}
}
MyCompare.java
public class MyCompare implements Comparator<Dog>{
/*
(non-Javadoc)
@see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
比较的数据类是系统的类那么无法修改代码实现对 Comparable接口compareTo方法的复写
那么就需要复写Comparator接口compare方法来实现对系统类数据的排序
*/
@Override
public int compare(Dog o1, Dog o2) {
if(o1.age > o2.age){
return 1;
}
if(o1.age < o2.age){
return -1;
}
return o1.name.compareTo(o2.name);
}
}
Test1.java
public class Test1 {
/*
1.对象数组的排序必须实现比较器接口(Comparable/Comparator)
自己定义比较规则
Comparable接口复写compareTo方法
比较器规则
如果返回正整数 则表示调用对象要大于参数对象
如果返回负整数 则表示调用对象要小于参数对象
如果返回0 则表示调用对象等于参数对象
sort方法再给对象数组排序时,自动调用元素的compareTo方法,如果该对象没有实现比较器接口,则内部代码强转报错
2.如果对象数组里面的对象对应的类不是我们自己定义的呢?
比如 math等系统自己写的类,不能改代码
那就要使用另外一个比较器接口
实现Comparator接口复写Compare方法
*/
public static void main(String[] args) {//系统的类
//Comparator接口的实现类比较
Dog[] dogs = {new Dog("aab", 5),new Dog("aac", 5),new Dog("abc", 6),new Dog("acc", 8)};
Arrays.sort(dogs, new MyCompare());
System.out.println(Arrays.toString(dogs));
}
public static void main1(String[] args) {//自己的类
//Comparable接口的实现类比较
Person[] persons = {new Person("abc", 13),
new Person("qwe", 14),
new Person("rty", 18),
new Person("uio", 16),
new Person("opq", 15),};
Arrays.sort(persons);
System.out.println(Arrays.toString(persons));
}
}