对象比较器

原创 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;
            }
        });

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

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

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

相关文章推荐

对象比较器

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

对象之间的比较

/**  *  */ package day10; /**  * @ClassName: Person  * @Description: TODO(这里用一句话描述这个类的作用)...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

TreeSet类对象的比较

TreeSet类与HashSet类十分类似。不过,数集是一个有序的集合。每次将一个元素添加到树中时,都被放置在正确的排序位置上。     TreeSet如何知道希望怎样排列的呢?在API文档中写道:T...

python对象的比较(is,==,对象大小比较>,<)

#一、python对象的"==、is"比较 """ 1、python的比较总是检查复合对象的所有部分,直到可以得出结果为止。 2、会自动遍历嵌套的所有数据结构,有多深走多深,首次发现的差值将决定比较的...

Java中实现对象的比较

Java中通过接口实现两个对象的比较, 首先类要实现comparable接口,使用泛型规定了要进行比较的对象所属的类, 而comparable接口的实现必须要定义的方法则是compareTo方法,...

比较两个类对象是否相同

前边有写过给相同类的对象赋值,今天有研究了比较两个类对象是否相同,当然前提是两个对象属于同一个类。比较的方法都是在ClassReflection类中实现的。下面是主要代码: package com....

比较二个对象值是否相等

C#中等值的判断主要是Equals方法和==操作符,对于引用类型,相等定义为对象相等;即这些引用是否引用同一对象。对于值类型,相等定义为按位相 等。在Object这个基类中,Equals方法默认为引用...

JAVA对象比较器Comparator

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

JAVA对象比较器Comparator

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

JAVA对象比较器Comparator

http://muscle-liu.iteye.com/blog/157261 排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序。 如将下列数字进...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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