您的位置:首页 > 其它

Comparable接口和Comparator接口的区别

2016-08-23 20:42 369 查看
1> Comparable接口里面的方法是 int compareTo(T o);

     Comparator接口里面的方法是 int compare(T o1,T o2);

 2>一个类既可以实现Comparable接口也可以实现Comparator接口

    如果希望一个类的比较方式有很多种,而且比较方式具有外部扩展性,那么可以实现Comparator接口,如果一个类默认的实现了Comparable接口,而你又希望再定义一个比较规则,那么你不可能去修改原类,因为这样会破坏封闭开放原则,最好的方法是写一个实现了Comparator接口的类。总的来说,Comparator接口比Comparable接口要灵活。

 3>如果一个集合类中存放着一些对象,如果希望对这个集合进行排序,可以使用Collections类里面的sort方法。

     sort方法有两种重载形式。

sort(Collection<T> c);   这种方法是根据类T里面默认的排序规则来排序的,即类T里面的compareTo方法

sort(Collection<T> c,Comparator<T> com);这种方法是根据类外面传进来的Comparator实现类类排序的。可以自己定义排序规则。

      请参考下面的程序package com.basic.collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Comparable和Comparator的区别 {

public static void main(String[] args) {
//测试Comparable方法
List<Person> list = new ArrayList<Person>();
list.add(new Person(1006,"jason",59));
list.add(new Person(1020,"meihao",32));
list.add(new Person(1001,"xiaolei",20));
list.add(new Person(1012,"edision",16));
list.add(new Person(1002,"wangyong",29));

System.out.println("排序前:....");
printList(list);

//通过Collections.sort方法来对List进行排序,是按照List里面的对象(Person)
//实现的Comparable接口的规则来排序的
Collections.sort(list);
System.out.println("####################");
System.out.println("默认的Name排序规则,排序后:....");
printList(list);

//通过NumberComparator定义的规则排序
Collections.sort(list,new NumberComparator());
System.out.println("####################");
System.out.println("Number排序规则,排序后:....");
printList(list);

//通过NumberComparator定义的规则排序
Collections.sort(list,new AgeComparator());
System.out.println("####################");
System.out.println("Age排序规则,排序后:....");
printList(list);

}

private static void printList(List<Person> list){
for(Person p:list){
System.out.println(p);
}
}

}

class Person implements Comparable<Person> {
public String name;
public int age;
public int number;

public Person(){}

public Person(int num,String name,int age){
this.number = num;
this.name = name;
this.age = age;
}

@Override
public int compareTo(Person o) {
return this.name.compareTo(o.name);
}

@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", number=" + number
+ "]";
}

}

class NumberComparator implements Comparator<Person>{

@Override
public int compare(Person o1, Person o2) {
return o1.number - o2.number;
}

}

class AgeComparator implements Comparator<Person>{

@Override
public int compare(Person o1, Person o2) {
return o1.age - o2.age;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: