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 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

时间: 2024-10-08 15:21:41

java中Comparable 和Comparator的相关文章

Java中Comparable和Comparator实现对象比较

1.通过Comparable实现排序 package Comparable; import java.util.Arrays; public class ComparableUser implements Comparable<ComparableUser> { private String id; private int age; public ComparableUser(String id, int age) { this.id = id; this.age = age; } publi

Java中Comparable和Comparator接口区别分析

Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧.Comparable 简介Comparable 是排序接口.若一个类实现了Comparab 本文要来详细分析一下Java中Comparable和Comparator接口的区别,

Java 中 Comparable 和 Comparator 比较(转)

转自http://www.cnblogs.com/skywang12345/p/3324788.html 本文,先介绍Comparable 和Comparator两个接口,以及它们的差异:接着,通过示例,对它们的使用方法进行说明. Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着“该类支持排序”.  即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该Li

Java中Comparable和Comparator区别小结

一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序. 此外,实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器.该接口定义如下: package java.lang; import java.util.*; public interface Comparable<T> {

Java中Comparable与Comparator的区别

相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都是Java的接口 区别 Comparator位于java.util包下,而Comparable位于java.lang包下 Comparable接口的实现是在类的内部(如 String.Integer已经实现了Comparable接口,自己就可以完成比较大小操作),Comparator接口的实现是在类

Java 中 Comparable 和 Comparator 比较

本文,先介绍Comparable 和Comparator两个接口,以及它们的差异:接着,通过示例,对它们的使用方法进行说明. Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着"该类支持排序".  即然实现Comparable接口的类支持排序,假设现在存在"实现Comparable接口的类的对象的List列表(或数组)",则该List列表(或数组)可以通过 Collections.sort(或 Array

Java中Comparable和Comparator的辨析

在对集合元素进行比较时一般使用TreeSet.对于简单的数据类型,TreeSet可以直接进行比较.但是对于复杂的数据类型,比如自己定义的数据类型或者类,就需要自己设置比较方法与比较规则了,这时就需要用到Comparable和Comparator了. 1.Comparable和Comparator都是用来实现集合中的元素的比较.排序的.但也有所区别: (1)Comparable是在集合内部定义的方法实现排序的,位于java.util下.而Comparator是在集合外部实现的排序位于java.la

【转载】Java中Comparable和Comparator比较

[本文转自]http://www.cnblogs.com/skywang12345/p/3324788.html Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着"该类支持排序".  即然实现Comparable接口的类支持排序,假设现在存在"实现Comparable接口的类的对象的List列表(或数组)",则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort

Java中Comparable和Comparator区别

一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序. 此外,实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器.该接口定义如下: package java.lang; import java.util.*; public interface Comparable<T> {