对象比较器

原创 2016年06月02日 13:29:37

在程序设计的过程中,经常会遇到需要进行排序的东西,对于一般的数字排序,有着各式各样的排序函数可以使用,但是他们经常是采取默认的方法进行排序的,当我么需要进行自定义的排序的时候,我们就需要自定义一个排序的方法,也就用到了对象比较器


对象比较器可以自己定义比较的对象按照某一属性进行排序,实现该方法有两种途径:

  1. 实现Comparable接口
  2. 实现Comparator接口

对于这两种方法分别用两个实例代码举例:

1.实现Comparable接口:

下面是定义了一个Person类,实现了Comparable接口
package ComparableAndComparator;

/**
 * Created by zhuxinquan on 16-6-1.
 */
public class Person implements Comparable<Person>{
    private String name;
    private int age;

    public Person() {
    }

    public 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 String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Person o) {
        //定义对象之间的比较规则
        if(o == null){
            throw new NullPointerException();
        }
        if(this.age < o.age){
            return -1;
        }else if(this.age > o.age){
            return 1;
        }
        return 0;
    }
}

实现了Comparable接口就要实现comparTo方法,该方法定义了对象之间的比较规则,举例来说,上面的person中的比较规则就是通过person对象的age属性来进行比较排序的。该排序方法返回1, -1或者0,分别表示大于,小于和等于,挡在外部使用排序算法对person对象进行排序的时候,默认调用的就是该方法,通过person对象的age属性进行排序。使用的操作如下:

import java.util.Arrays;

/**
 * Created by zhuxinquan on 16-6-1.
 */
public class PersonSortDemo{
    public static void main(String[] args) {
        String[] names = {"hell", "erteri", "fedfs"};
        Person[] persons = {
                new Person("hell", 27), new Person("erteri", 29),
                new Person("fedfs", 34)
        };
        Arrays.sort(names);
        System.out.println(Arrays.toString(names));

        Arrays.sort(persons);
        System.out.println(Arrays.toString(persons));
    }
}

上面的Arrays.sort方法是对数组进行排序,当数组是字符串的时候,默认采用字符串的ascii进行排序,实际上String类实现了Comparable接口,定义了下面的compareTo方法:

//String类中的compareTo方法
public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }

上面String类中的compareTo方法和person类中定义的方法都是通过自身和传进来的参数进行进行比较的。当我们直接调用Array.sort方法时,就会默认使用person类中的compareTo进行比较排序。

=======================================================

1.实现Comparator接口:

自定义一个比较器,然后实现Comparator接口,要进行排序时再讲比较器连通要进行排序的对象一块传入,即可按照自定义比较器中定义的方法进行比较排序。如下,定义了一个Person2Comparator类实现了Comparator接口:

package ComparableAndComparator;
import java.util.Comparator;
/**
 * 自定义类比较器
 * Created by zhuxinquan on 16-6-1.
 */
public class Person2Comparator implements Comparator<Person2>{

    @Override
    public int compare(Person2 o1, Person2 o2) {
        if(o1 == null || o2 == null){
            throw new NullPointerException();
        }

        if(o1.getAge() < o2.getAge()){
            return -1;
        }else if(o1.getAge() > o2.getAge()){
            return 1;
        }
        return 0;
    }
}

其中实现了compare方法,该方法和Comparable类中的compareTo方法一样,返回值分别是-1, 1, 0。与之不同的是,该方法一次性传入两个对象参数进行比较,而前面的传入一个与自身进行比较。使用如下:

Arrays.sort(persons2, new Person2Comparator());

直接传入要比较的对象和自定义的比较器即可。


为了方便使用(有可能所有的代码中只使用到一次比较器),我们可以直接声明一个内部类,直接实现Comparator类即可,如下:

        Arrays.sort(persons, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                if(o1.getAge() > o2.getAge()){
                    return 1;
                }
                return 0;
            }
        });

这样直接在参数中声明了一个比较器类,实现了其中的方法。

========================================================

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java 对象比较器 comparator 的作用及用法

排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序。 如将下列数字进行排序 1,3,5,8,3,6 于是我们得出结果 1,3,3,5,6,8 将下列字母(字符...

Java常用类库——Arrays类(用于普通数组操作)、比较器(Comparable、Comparator 用于对象排序)的使用

学习目标 掌握Arrays类的使用 掌握填充以及排序器 掌握Comparable比较接口的使用 了解比较器的基本排序原理 掌握Comparator比较接口的使用 Arrays类 Arrays类是数...

JAVA对象比较器Comparator

排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序。如将下列数字进行排序1,3,5,8,3,6于是我们得出结果1,3,3,5,6,8将下列字母(字符)进行排序a,i,e...

Java-对象比较器

在Java中要想对两个对象进行比较大小,需要实现Comparable接口或Comparator接口。String类型的值之所以可以比较大小(汉字根据ANSI值的大小进行比较),是因为String类实现...

Java比较器给List中的对象排序

今天用到了Collections类的sort方法 Collections.sort方法有2个构造方法,这个讲下使用比较器的那个方法。 第一个参数为: List      第二个参数为: Compara...
  • edc0228
  • edc0228
  • 2016年08月09日 11:42
  • 318

JAVA对象比较器Comparator

排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序。  如将下列数字进行排序  1,3,5,8,3,6  于是我们得出结果  1,3,3,5,6,8  将下列字母(字符...

[Java]有关比较器(Comparator接口)的用法及对象数组排序问题

跟上篇文章一样,今天讨论的对象也是Arrays.sort()方法与Comparator接口的相互用法。...

使用比较器让对象进行排序

java Comparator

【java对象比较器和克隆】

一.比较器Comparable和Comparator            上一篇博客介绍了工具类Arrays工具类。我们可以对基本类型的数组调用Arrays.sort()函数来进行数组的排序。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对象比较器
举报原因:
原因补充:

(最多只允许输入30个字)