Comparable和Comparator接口

Comparable/Comparator

1
2
3
4
5
package java.lang;

public interface Comparable<T> {
int compareTo(T var1);
}
1
2
3
4
5
6
7
8
9
package java.util;

public interface Comparator<T> {
int compare(T var1, T var2);

boolean equals(Object var1);

// ... 一些默认方法
}

使用Comparable接口

Person类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Person implements Comparable<Person>{
private int age; // 年龄
private String name; // 姓名

public Person(int age, String name) {
this.age = age;
this.name = name;
}

@Override
public int compareTo(Person person) {
return this.age - person.age; // 按年龄从小到大顺序
}

@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

public class Test {
public static void main(String[] args) {
Person p1 = new Person(21,"小明");
Person p2 = new Person(18,"黑子");
Person p3 = new Person(24,"里加");
ArrayList<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
System.out.println(list);
Collections.sort(list);
System.out.println(list);
}
}

使用Comparator接口

Cat类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Cat {
private int age;
private String name;

public Cat(int age, String name) {
this.age = age;
this.name = name;
}

public int getAge() {
return age;
}

public String getName() {
return name;
}

@Override
public String toString() {
return "Cat{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Test1 {
public static void main(String[] args) {
Cat c1 = new Cat(3,"删除");
Cat c2 = new Cat(4,"拉黑");
Cat c3 = new Cat(2,"禁言");
ArrayList<Cat> list = new ArrayList<>();
list.add(c1);
list.add(c2);
list.add(c3);
System.out.println(list);
Collections.sort(list, new Comparator<Cat>() {
@Override
public int compare(Cat cat, Cat t1) {
return t1.getAge() - cat.getAge(); // 年龄从大到小的顺序排列
}
});
System.out.println(list);
}
}

注意事项|区别

  • Comparable接口:在创建一个类时,如果一个类本身具有排序的属性,那么这个类最好去实现Comparable接口,并override其ComparaTo方法;
  • Comparator接口:如果一个类没有实现Comparable接口,并且这个类已经不方便修改,那么可以采用外部比较器Comparator;
  • 如果一个类已经实现了Comparable接口,但是其中的排序规则不是所需要的,而且这个类不方便改动时,仍然可以使用外部比较器Comparator; 会优先使用外部比较器,实现的Comparable接口的定义规则会被忽略。

Comparable和Comparator接口
https://blog.wangxk.cc/2020/08/24/Comparable和Comparator接口/
作者
Mike
发布于
2020年8月24日
许可协议