实现比较器的两种方法

实现

  1. Comparable实现比较器
    Comparable实现比较器,是定义在Person类的内部的,因此实体类Person需要实现实现Comparable接口,然后覆写compareTo方法。
package leif;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

public class Test {
    public static void main(String[] args) {
        Person person0 = new Person("aaa", 16);
        Person person1 = new Person("bbb", 20);
        Person person2 = new Person("aaa", 18);
        Person person3 = new Person("bbb", 14);
        Person person4 = new Person("ccc", 14);
        Person person5 = new Person("ccc", 15);
        Person person6 = new Person("ddd", 13);
        Person person7 = new Person("bbb", 15);
        Person person8 = new Person("ddd", 16);
        Person person9 = new Person("bbb", 14);
        List personList = Stream.of(person0, person1, person2, person3, person4, person5, person6, person7, person8, person9).collect(Collectors.toList());
        Collections.sort(personList);
        personList.forEach(System.out::println);
    }
}

@Data
@NoArgsConstructor
@AllArgsConstructor
class Person implements Comparable {
    private String name;
    private int age;

    // 先比较年龄,若年龄相等则比较名字,升序排列
    @Override
    public int compareTo(Person another) {
        int i = age - another.getAge();

        if (i == 0) {
            return name.compareTo(another.getName());
        } else {
            return i;
        }
    }
}
  1. Comparator实现比较器
    Comparator实现比较器,是定义在Person类的外部的,因此实体类Person不需要做任何变化,只需要自定义类实现Comparator接口并覆写compare方法。
package leif;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

public class Test {
    public static void main(String[] args) {
        Person person0 = new Person("aaa", 16);
        Person person1 = new Person("bbb", 20);
        Person person2 = new Person("aaa", 18);
        Person person3 = new Person("bbb", 14);
        Person person4 = new Person("ccc", 14);
        Person person5 = new Person("ccc", 15);
        Person person6 = new Person("ddd", 13);
        Person person7 = new Person("bbb", 15);
        Person person8 = new Person("ddd", 16);
        Person person9 = new Person("bbb", 14);
        List personList = Stream.of(person0, person1, person2, person3, person4, person5, person6, person7, person8, person9).collect(Collectors.toList());

        personList.sort((p1, p2) -> {
            int i = person1.getAge() - person2.getAge();

            if (i == 0) {
                return person1.getName().compareTo(person2.getName());
            } else {
                return i;
            }
        });

        personList.forEach(System.out::println);
    }
}

@Data
@NoArgsConstructor
@AllArgsConstructor
class Person {
    private String name;
    private int age;
}

结果

image.png

总结

  1. Comparable与Comparator都是Java的接口,用来对自定义的实体对象进行比较,都需要覆写方法。
  2. Comparable定义在实体类内部,需要覆写compareTo方法,所以实体类对象本身就有比较大小的可能。但如果想换一种比较规则,那么就必须修改实体类本身
  3. Comparator定义在实体类外部,需要覆写compare方法,所以排序时必须同时传入数据和比较器。如果想换一种比较规则,则仅需要修改比较器,实体类则不需要任何改变

你可能感兴趣的:(实现比较器的两种方法)