今天看啥  ›  专栏  ›  江湖非良人

比较器

江湖非良人  · 简书  ·  · 2019-07-25 14:52

Comparable

  所谓的比较器指的是进行大小关系的确定判断。
  如果要进行数组操作,一般都会使用java.util.Arrays的操作类完成,这个类中提供了很多常见的数组操作支持,包括对象数组的排序: public static void sort​(Object[] a);
范例:实现对象数组的排序

import java.util.Arrays;
public class JavaApiDemo {
    public static void main(String[] args) throws Exception {
        Integer[] data = new Integer[]{10, 9, 5, 2, 20};//对象数组
        Arrays.sort(data);//进行对象数组排序
        System.out.println(Arrays.toString(data));
        String[] strs = new String[]{"pear", "apple", "banana", "watermelon", "melon"};//对象数组
        Arrays.sort(strs);//进行对象数组排序
        System.out.println(Arrays.toString(strs));
        //[2, 5, 9, 10, 20]
        //[apple, banana, melon, pear, watermelon]
    }
}

  java.lang.Integer与java.lang.String两个类都是由系统提供的程序类,那么如何实现自定义的类的排序处理呢?
范例:自定义的类进行排序处理(错误示范)

import java.util.Arrays;
class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "【Person类对象】姓名:" + this.name + "、年龄:" + this.age;
    }
}
public class JavaApiDemo {
    public static void main(String[] args) throws Exception {
        Person[] data = new Person[]{new Person("张三",30), new Person("李四",31), new Person("王五",28), new Person("赵六",38), new Person("孙七",37),};//对象数组
        Arrays.sort(data);//进行对象数组排序
        System.out.println(Arrays.toString(data));
        //运行时异常:Exception in thread "main" java.lang.ClassCastException: com.mldn.demo.Person cannot be cast to java.lang.Comparable
    }
}

  任意一个类默认情况下是无法使用系统内部的类进行数组排序或比较需求的,因为类中并没有明确的表明比较的规则定义,在Java中为了统一比较规则的定义,所以从JDK1.2后提供了比较器的接口:Comparable接口。

public interface Comparable<T>{
    /**
     * 实现对象的比较处理操作
     * @param o 要比较的对象
     * @return this-o的值(int)
     */
    int compareTo​(T o);
}

Comparable

范例:使用Comparable实现自定义的类排序处理

import java.util.Arrays;
class Person implements Comparable<Person>{
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "【Person类对象】姓名:" + this.name + "、年龄:" + this.age;
    }

    @Override
    public int compareTo(Person person) {
        return this.age-person.age;//升序
//        return person.age-this.age;//降序
    }
}
public class JavaApiDemo {
    public static void main(String[] args) throws Exception {
        Person[] data = new Person[]{new Person("张三",30), new Person("李四",31), new Person("王五",28), new Person("赵六",38), new Person("孙七",37),};//对象数组
        Arrays.sort(data);//进行对象数组排序
        System.out.println(Arrays.toString(data));
        //[【Person类对象】姓名:王五、年龄:28, 【Person类对象】姓名:张三、年龄:30, 【Person类对象】姓名:李四、年龄:31, 【Person类对象】姓名:孙七、年龄:37, 【Person类对象】姓名:赵六、年龄:38]
    }
}

  在Java中要实现排序只需要有一个compareTo()方法进行排序规则的定义就可以了。

Comparator

  Comparator属于一种挽救的比较器支持,其主要的目的是解决一些没有实现Comparable接口的对象数组排序操作。

  • 基于【Arrays】Comparator的排序处理:public static <T> void sort​(T[] a, Comparator<? super T> c);
    Comparator

      在java.util.Comparator中,最初只定义了一个排序的compareTo()方法:int compare​(T o1, T o2);后来持续发展又增加了许多static的方法。
    范例:使用Comparator定义排序规则
import java.util.Arrays;
import java.util.Comparator;
class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "【Person类对象】姓名:" + this.name + "、年龄:" + this.age;
    }
}
public class JavaApiDemo {
    public static void main(String[] args) throws Exception {
        Person[] data = new Person[]{new Person("张三",30), new Person("李四",31), new Person("王五",28), new Person("赵六",38), new Person("孙七",37),};//对象数组
        Arrays.sort(data, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge()-o2.getAge();//升序
//                return o2.getAge()-o1.getAge();//降序
            }
        });//进行对象数组排序
        System.out.println(Arrays.toString(data));
        //[【Person类对象】姓名:王五、年龄:28, 【Person类对象】姓名:张三、年龄:30, 【Person类对象】姓名:李四、年龄:31, 【Person类对象】姓名:孙七、年龄:37, 【Person类对象】姓名:赵六、年龄:38]
    }
}

  对于这种排序的操作如果不是必须的情况下,强烈不建议使用Comparator,最好以Comparable为主。




原文地址:访问原文地址
快照地址: 访问文章快照