Gear with Code Java Engineer

java比较器

2019-07-10

今天学习一下java的比较器的含义和用法。

1 为什么要有比较器

在很多的算法中需要对两个对象进行比较大小,最典型就是排序算法。可以理解,既然要对一些对象进行排序,首先必须知道怎么定义两个对象的大小。对于java内置类型,比如int、double、String等,标准库中已经定义好了比较方法。那么对于用户自定义的类型,如果要进行涉及到比较大小的操作,用户就必须自定义比较方法,也就是必须要有比较器。
这与C++标准库类似,C++标准库的sort方法有两种提供比较器的方法,一是重载类型的”<”运算符,另一种是额外提供一个比较器(常见的是提供lambda表达式,传入两个对象传出一个bool值)。在java中采用了类似的解决方法,分别是Comparable接口和Comparator比较器。

2 Comparable接口

先看下面一个例子,要对Person这个类型进行排序的时候,根据比较标准的不同结果也不同,例如可以根据身高、体重等进行排序。

package javademo;

import java.util.Arrays;

public class JavaDemo {
    public static void main(String[] args) {
        Person[] persons = { new Person("小凯", 185, 70, 20), new Person("小菲", 48.44, 160, 23),
                new Person("小杰", 165, 60, 19) };
        Arrays.sort(persons);
        System.out.println(Arrays.toString(persons));
    }
}

class Person implements Comparable<Person> {
    @Override
    public int compareTo(Person o) { // 按照体重进行比较
        // TODO Auto-generated method stub
        return (int) (this.height - o.height);
    }

    Person(String name, double height, double weight, int age) {
        this.name = name;
        this.weight = weight;
        this.height = height;
        this.age = age;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return this.name;
    }

    private String name;
    private double height;
    private double weight;
    private int age;
}

输出结果:[小菲, 小杰, 小凯]

3 Comparator接口

下面使用Comparator按照年龄进行排序,Comparator接口由于只有一个方法,因此可以使用lambda表达式来代替。

package javademo;

import java.util.Arrays;

public class JavaDemo {
    public static void main(String[] args) {
        Person[] persons = { new Person("小凯", 185, 70, 20), new Person("小菲", 48.44, 160, 23),
                new Person("小杰", 165, 60, 19) };
        Arrays.sort(persons, (Person a, Person b) -> {
            return a.getAge() - b.getAge(); // 按照年龄进行排序
        });
        System.out.println(Arrays.toString(persons));
    }
}

class Person implements Comparable<Person> {
    @Override
    public int compareTo(Person o) { // 按照体重进行比较
        // TODO Auto-generated method stub
        return (int) (this.height - o.height);
    }

    Person(String name, double height, double weight, int age) {
        this.name = name;
        this.weight = weight;
        this.height = height;
        this.age = age;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return this.name;
    }

    public int getAge() {
        return age;
    }

    private String name;
    private double height;
    private double weight;
    private int age;
}

输出结果:[小杰, 小凯, 小菲]


Comments

Content