目录
前言
本文章是我自己听了课之后整理的笔记。
一、基本介绍
Comparable是java.lang包下的一个接口。
-
此接口对实现它的每个类的对象强加一个总排序。 这种排序被称为类的自然顺序 ,类的
compareTo
方法被称为其自然比较方法 。 -
实现此接口的对象的列表(和数组)可以由
Collections.sort
(和Arrays.sort
)自动排序。 实现该接口的对象,可以使用如sorted map或sorted set 这些有序的集合时,而不需要指定一个comparator
Comparator是java.util包下的一个接口。
-
通过实现一个比较器(实现了Comparator接口),它对某些对象集合施加总排序 。 可以将比较器传递给排序方法(例如
Collections.sort
或Arrays.sort
),以便精确控制排序顺序。 比较器还可用于控制某些数据结构的顺序(例如sorted sets
或sorted maps
),或者为没有natural ordering
的对象集合提供排序。
二、使用步骤
(1)Comparable 的实现
class Person1 implements Comparable<Person1>{
private String name; //名字
private int age; //年龄
private double point; //分数
public Person1() {
}
public Person1(String name, int age, double point) {
this.name = name;
this.age = age;
this.point = point;
}
@Override
public int compareTo(Person1 o) {
if(this.getPoint() > o.getPoint()){
return 1;
}else if(this.getPoint() < o.getPoint()){
return -1;
}else{
if(this.getAge() > o.getAge()){
return 1;
}else if (this.getAge() < o.getAge()){
return -1;
}else {
return 1; //如果年龄成绩都相同,排序随意。我这里传1,也可传-1.但不能传0。因为会不存储。
}
}
}
}
(2)Comparator的实现
比较器的实现:
class PersonComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
if(o1.getPoint() > o2.getPoint()){
return 1;
}else if (o1.getPoint() < o2.getPoint()){
return -1;
}else {
if (o1.getAge() > o2.getAge()){
return 1;
}else if (o1.getAge() < o2.getAge()){
return -1;
}else{
return 1; //这里返回负数正数都行,但不能返回0
}
}
}
}
Person类:
class Person{
private String name;
private int age;
private double point;
public Person() {
}
public Person(String name, int age, double point) {
this.name = name;
this.age = age;
this.point = point;
}
}
(3)测试
public class Demo3 {
public static void main(String[] args) {
TreeSet<Person1> treeSet = new TreeSet<>();
Person1 p1 = new Person1("贾宝玉",14,88.5);
Person1 p2 = new Person1("林黛玉",13,90.5);
Person1 p3 = new Person1("史湘云",13,85);
Person1 p4 = new Person1("贾宝钗",15,91);
Person1 p5 = new Person1("hahha",15,88.5);
treeSet.add(p1);
treeSet.add(p2);
treeSet.add(p3);
treeSet.add(p4);
treeSet.add(p5);
for (Person p:treeSet) {
System.out.println(p);
}
Person[] people = new Person[5];
PersonComparator personComparator = new PersonComparator();
people[0] = new Person("贾宝玉",14,88.5);
people[1] = new Person("林黛玉",13,90.5);
people[2] = new Person("史湘云",13,85);
people[3] = new Person("贾宝钗",15,91);
people[4] = new Person("hahha",15,88.5);
Arrays.sort(people, personComparator);
for (Person p:people) {
System.out.println(p);
}
}
}
三.测试结果
效果是一样的。
总结
以上的就是Comparable和Comparator的基本使用。通俗的理解下就是Comparable是目标类自己实现该接口,Comparator是要通过一个比较器来实现该接口,然后在目标类比较的时候再把比较器传过去来控制比较的顺序。
至于两者的区别我也是网上看别人的博客理解的。这里贴一个链接:
https://www.cnblogs.com/xujian2014/p/5215082.html
这个我觉得很厉害,比我这篇更好理解。但我刚开始写,以后努力以这个为写博客的目标。
另外,如果有不足之处,无论内容还是博客格式,都可指出,我会改正!
我是所以,祝你幸福!
补充:
compareTo方法 中的返回值分为三类:正数,零和负数。
- 正数:代表前者大,即排序的顺序靠前
- 负数:代表后者大,即排序的顺序靠前
- 零:代表一样大。(注意:在TreeSet这些顺序的集合中,返回0是不会把数存进集合中)
如:
这里的逻辑是当两人年龄和成绩都一样时,返回0。所以后存储的hahha就不再存进集合。
public class Demo3 { public static void main(String[] args) { TreeSet<Person1> treeSet = new TreeSet<>(); Person1 p1 = new Person1("贾宝玉",14,88.5); Person1 p2 = new Person1("林黛玉",13,90.5); Person1 p3 = new Person1("史湘云",13,85); Person1 p4 = new Person1("贾宝钗",15,91); Person1 p5 = new Person1("hahha",14,88.5); treeSet.add(p1); treeSet.add(p2); treeSet.add(p3); treeSet.add(p4); treeSet.add(p5); for (Person1 p:treeSet) { System.out.println(p); } } }
结果如下: