java中Comparable 和Comparator

java中Comparable 和Comparator

-Comparable接口

接口定义

public interface Comparable<T> {  
   public int compareTo(T o);  
}  

该接口中仅仅包含了一个compareTO()函数,

int compareTo(Object o): 比较当前实例对象与对象o,如果位于对象o之前,返回负值,如果两个对象在排序中位置相同,则返回0,如果位于对象o后面,则返回正值。

    实例:
    x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。

如何使用:由于Comparable接口定义类的自然顺序,实现该接口的类就可以按这种方式排序。(即可以直接调用.sort()方法实现排序)

如:

package bolg;

public class Person implements Comparable{

    String name;
    int age;

    Person(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        int i = 0;
        i=name.compareTo(((Person)o).name);

        if(0==i)
        {
            return age-((Person)o).age;

        }
        else {
            return i;
        }
    }

}


Test


package bolg;

import java.util.Arrays;

public class TestPerson {


    public static void   main(String args[])
    {
     Person[] persons = new Person[] { new Person("a", 30), new Person("ab", 20) };
        Arrays.sort(persons);
        for (int i = 0; i < persons.length; i++) {
            Person user = persons[i];
          System.out.println(user.getName() + " " + user.getAge());
        }
    }
}

输出结果

a 30
ab 20

-Comparator接口

接口定义如下

public interface Comparator<T> {  
   int compare(T o1, T o2);  
   boolean equals(Object obj);  
} 

(01)若一个类要实现Comparator接口:它一定要实现compareTo(T 1, T 2) 函数,但可以不实现 equals(Object obj) 函数。

    为什么可以不实现 equals(Object obj) 函数呢? 因为任何类,默认都是已经实现了equals(Object obj)的。 Java中的一切类都是继承于java.lang.Object,在Object.java中实现了equals(Object obj)函数;所以,其它所有的类也相当于都实现了该函数。

(02) int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。

如何使用:Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:

  • 1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
  • 2、可以使用多种排序标准,比如升序、降序等

实例,实现一个比较器,仅仅按照年龄大小排序

package bolg;

import java.util.Comparator;

public class PersonComparator implements Comparator{

    @Override
    public int compare(Object o1, Object o2) {
        // TODO Auto-generated method stub      
        return ((Person) o1).getAge() - ((Person) o2).getAge();

    }
}
package bolg;

import java.util.Arrays;

public class TestPerson {


    public static void   main(String args[])
    {
     Person[] persons = new Person[] { new Person("a", 30), new Person("ab", 20) };
      //  Arrays.sort(persons);
    Arrays.sort(persons,new PersonComparator());
        for (int i = 0; i < persons.length; i++) {
            Person user = persons[i];
          System.out.println(user.getName() + " " + user.getAge());
        }
    }
}

输出结果

ab 20
a 30

-Comparable 和 Comparator区别比较


Comparable强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。


Comparator强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。思想其实就是java设计模式中的 ----策略者模式

总结:两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。