集合的排序,COmparable和Comparator的区别

来源:互联网 发布:数据库的数据类型 编辑:程序博客网 时间:2024/05/29 11:02
集合的排序
    集合有三个子接口,分别是List、Set、Queue接口。
    首先对List集合排序,List有序可重复。
    介绍一个类 Collections
    类完全由在 collection 上进行操作或返回 collection 的静态方法组成。它包含在 collection 上操作的多态算法,即“包装器”,包装器返回由指定 collection 支持的新 collection,以及少数其他内容。


static void sort(List<T> list) 
    根据元素的自然顺序 对指定列表按升序进行排序。
    一般实现了Comparable接口,如Integer类,String类等。如果集合里面加的是对象,可以通过对象的类实现Comparable接口。
sort(List<T> list, Comparator<? super T> c)
    根据指定比较器产生的顺序对指定列表进行排序
    Comparator当集合中的对象不支持自比较或者自比较的功能不满足程序员的需求时,可以写一个比较器来完成两个对象之间的比较,从而实现按比较器规则进行排序的功能。一般通过内部类实现。


通过下面的代码说明Comparable和Comparator的区别。


public class Person implements Comparable<Person>{
int age;
String name;
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}

public Person(){}
@Override
public String toString() {
// TODO Auto-generated method stub
return "name:"+name+",age:"+age+"\n";
}
@Override
public int compareTo(Person p) {
// TODO Auto-generated method stub
return this.name.compareTo(p.name);
}

// 年龄排序(内部类实现Comparator接口。实现比较器比较)
private static class SortByAge implements Comparator<Person>{
@Override
public int compare(Person p1, Person p2) {
// TODO Auto-generated method stub
return p1.age - p2.age;
}

}
public static Comparator getSortByAge(){
return new SortByAge();
}
// 反序年龄排序(同上)
private static class DesSortByAge implementComparator<Person>{
@Override
public int compare(Person p1, Person p2) {
// TODO Auto-generated method stub
return p2.age - p1.age;
}
}
public static  Comparator getDesSortByAge(){
return new DescSortByAge();
}



}
//测试Comparabel(内部比较器),让名字进行自然顺序排序
public class TestPerson {

public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<Person>();

list.add(new Person(20,"abc"));
list.add(new Person(30,"aaa"));
list.add(new Person(25,"ddd"));
list.add(new Person(29,"ccc"));

System.out.println("没有排序之前");
System.out.println(list);//Person里面重写了toString方法
Collections.sort(list);
System.out.println("排序之后");
System.out.println(list);

}
}
//测试Comparator(专用比较器),让年龄进行排序
public class TestPerson {

public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<Person>();

list.add(new Person(20,"abc"));
list.add(new Person(30,"aaa"));
list.add(new Person(25,"ddd"));
list.add(new Person(29,"ccc"));

System.out.println("没有排序之前");
System.out.println(list);
System.out.println("排序之后");
Collections.sort(list,Person.getSortByAge());
System.out.println(list);


System.out.println("反序年龄排序:");
Collections.sort(list,Person.getDescSortByAge());
System.out.println(list);;

}
}
    其次Set集合,Set集合无序且不可重复。里面有个实现类TreeSet,是一个具有排序功能Set接口类。
    TreeSet集合中的元素按照升序排列,默认是自然顺序排列,也就是说TreeSet集合中的对象需要实现Comparable接口。原理同上(Person implements Comparable)。
    如果添加的是String、Interger类等已经实现了Comparable接口,默认按自然顺序排序。





原创粉丝点击