Java比较器

Comparator

自己创建的类组成的列表,如果没有重写排序的方法,那么就没办法对它进行排序,这时就能手动建立一个专属于它的比较器,来实现对这个列表的排序,Comparator 这个接口就能实现

1
2
3
4
5
6
7
8
9
10
ArrayList<Person> son = new ArrayList<>();
son.add(new Person("王师傅", 35));
son.add(new Person("刘师傅", 17));
son.add(new Person("张师傅", 28));
Collections.sort(son, new Comparator<Person>() { //重写了Comparator接口的compare方法
@Override
public int compare(Person t1, Person t2) {
return t1.getAge() - t2.getAge();
}
});

list和set都是Collection的子类,Collections类仅由静态方法组合或返回集合,它包含对集合进行操作的多态算法
在这里使用Collections里的sort方法,对son这个list排序,但Person这个类是我自己创建的,无法进行排序,所以重写了compare方法,对这个list进行了排序

t1-t2是升序,t2-t1是降序
理解:

  • 如果是t1-t2,当传进来的两个元素,t1比t2大,那么就会返回一个大于0的数,说明这个值要进行一次交换,把小的放在前面,小于0则不较换
  • 如果是t2-t1,当传进来的两个元素,t1比t2大,那么就会返回一个小于0的数,不用进行交换,就把大的放在了前面,小的放在了后面,大于0就进行交换

Comparable

Comparable 是一个接口,对实现它的每个类的对象强加一个整体排序,这个排序被称为类的自然排序,类的compareTo方法被称为其自然比较方法
而自己创建的类没有 compareTo方法,所以在创建类的时候就可以继承 Comparable 这个接口,实现它的 compareTo 方法

1
2
3
4
5
6
7
8
9
public class Person implements Comparable<Person>{ //泛型,Comparble接口是一个泛型接口
private String name;
private int age;
@Override
public int compareTo(Person person) {
//自定义比较规则
return this.getAge()-person.getAge();//按照年龄升序排序
}
}

使用:

1
2
3
4
5
6
7
8
ArrayList<Person> per = new ArrayList<>();
per.add(new Person("张三", 143143));
per.add(new Person("李四", 424));
per.add(new Person("王五", 303452));
per.add(new Person("赵六", 23440));
System.out.println(per);
Collections.sort(per);
System.out.println(per);

调用 Collections 类里的sort这个静态方法,就是在调用 compareTo,重写后就能对这个列表排序了


没想到泛型这东西还是没有理解透,翻看了好几次 Java泛型这篇博客,看来写博客还是有用的,可以快速回忆自己当时是怎么想的