java中对集合或数组进行排序有两种方法:Comparable 与 Comparator

来源:互联网 发布:2015最好的网络机顶盒 编辑:程序博客网 时间:2024/06/15 12:48

对集合或数组进行排序有两种方法

1 集合中的对象所属的类实现了java.lang.Comparable 接口

然后调用Collections.sort()或者Arrays.sort()可直接对该集合中的对象排序。

 

public interface Comparable<T>{

         publicint compareTo(T o)

}

此接口强行对实现它的每个类的对象进行整体排序,这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。

 

注:对于实现Comparable接口的类 C 的每一个 e1 和 e2 来说,当且仅当 e1.compareTo(e2)== 0 与 e1.equals(e2) 具有相同的 boolean 值时,类 C 的自然排序才叫做与 equals 一致。注意,null 不是任何类的实例,即使 e.equals(null) 返回 false,e.compareTo(null) 也将抛出NullPointerException。建议(虽然不是必需的)最好使自然排序与 equals 一致。这是因为在使用自然排序与equals 不一致的元素(或键)时,没有显式比较器的有序集合(和有序映射表)行为表现“怪异”。尤其是,这样的有序集合(或有序映射表)违背了根据 equals 方法定义的集合(或映射表)的常规协定。

 

例子:

/**           

利用 Comparable 接口创建自己的类的排序顺序,只是实现 compareTo() 方法的问题。通常就是依赖几个数据成员的自然排序。同时类也应该覆盖 equals() 和 hashCode() 以确保两个相等的对象返回同一个哈希码。

这个接口的作用:如果数组或者集合中的(类)元素实现了该接口的话 , 我们就可以调用 Collections.sort和 Arrays.sort 排序,或应用于有序集合 TreeSet 和 TreeMap 中。

*/

public class Person implementsjava.lang.Comparable{

         privatefinal int id;

         privateString name;

         privateint age;

         publicPerson(int id,String name,int age){

                   super();

                   this.id= id;

                   this.name= name;

                   this.age= age;

         }

         //实现 Comparable 接口的抽象方法,定义排序规则

         @Override

         publicint compareTo(Object o) {

                   Personper = (Person)o;

                   returnthis.id - per.id;

         }

}

也可以:

public class Person implementsjava.lang.Comparable<Person>{

         privatefinal int id;

         privateString name;

         privateint age;

         publicPerson(int id,String name,int age){

                   super();

                   this.id= id;

                   this.name= name;

                   this.age= age;

         }

         //实现 Comparable 接口的抽象方法,定义排序规则

         @Override

         publicint compareTo(Person o) {

                   returnthis.id - per.id;

         }

}

 

2 实现java.lang.Comparator接口

把这个实现接口的类作为参数传递给上述的sort()方法。

public interface Comparator<T>{ 

    public int compare(To1,T o2) ;  

    boolean equals(Object obj) ; 

必须实现compare方法,建议在其作用类中实现equals方法(Object有默认的equals实现,所以子类非必须实现)

 

例子:

在Arrays类里:

public static <T> void sort(T[]a, Comparator<? super T> c)


0 0