comparable和compartor都是接口,两个接口使用的是策略模式
- comparable: 想要具有比较功能的类需要实现comparable接口,并且重写compareTo方法,方法参数必须是Object,需要强制类型转换,(可以先用instanceof判断一下)
- compartor: 这个可以在不改变原来的类的情况下实现比较,只需要写一个xxxCompartor(其实命名随意,这样更易懂)来实现Compartor接口即可,同时重写compare方法,形参是xxx类(就是原有的需要比较的类).
注意点:
这里面compare方法和compareto方法返回值全是int,以正负为结果,而不是0和1;
父类实现了compartable的话,子类可以进行比较,当然也可以重写compartTo方法
如果采用第二种,子类可以在比较的时候传入父类的compare方法,这样的话就等于向上转型为父类进行比较,也是可以的,或者再写一个子类Compartor实现Compartor接口重写定义比较方法.
这里是父类Person
public class Person implements Comparable {
public int age;
public Person() {
age = (int) (Math.random() * 10);
System.out.println("age = " + age);
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
'}';
}
@Override
public int compareTo(Object o) {
Person p = null;
if(o instanceof Person){
p = (Person) o;
}else return -1;
if (this.age < p.age) return -1;
else
return 0;
}
public void say() {
System.out.println("haha!");
}
}
这是子类son,重写了父类的compareTo方法
package package1;
public class son extends Person {
@Override
public String toString() {
return "son{" +
"age=" + age +
'}';
}
@Override
public int compareTo(Object o){
return -1;
}
}
父类比较算法
package package1;
import java.util.Comparator;
public class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
if (o1.age < o2.age)
return -1;
else return 1;
}
}
测试类:
import package1.PersonComparator;
import package1.Person;
import package1.son;
import java.util.*;
public class test {
private int i;
public static void main(String[] args) {
List a = new ArrayList<Person>();
int n = 10;
while (n-- > 0) {
Person p = new son();
a.add(p);
}
// a.sort(new PersonComparator());
// Collections.sort(a,new PersonComparator());
Collections.sort(a);
for (Iterator it = a.listIterator(); it.hasNext();){
System.out.println(it.next());
}
// int n = 5;
while (n-- > 0) {
System.out.println(1);
}
}
}