Java中Comparable和Comparator比较
Posted 三月烟雨飘摇的南方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中Comparable和Comparator比较相关的知识,希望对你有一定的参考价值。
Comparable 是一个排序接口,如果一个类实现了该接口,说明该类本身是可以进行排序的。注意,除了基本数据类型(八大基本数据类型) 的数组或是List,其余类型的对象,Collections.sort或Arrays.sort 是不支持直接进行排序的,因为对象本身是没有“顺序”的,除非你实现了Comparable 接口或是自定义了Comparable 对象,指定了排序规则,才可以进行排序。
Comparable 源码就一个方法,
1 public interface Comparable<T> { 2 public int compareTo(T o); 3 }
定义一个对象:
1 public class Person implements Comparable<Person>{ 2 public int age; 3 4 public Person(int age){ 5 this.age = age; 6 } 7 public String toString() { 8 return "{" + 9 "age=" + age + 10 ‘}‘; 11 } 12 @Override 13 public int compareTo(Person o) { 14 //Person 对象之间根据名字排序 15 return this.age - o.age; 16 } 17 }
排序测试:
public static void main(String[] args) { Person[] ps =new Person[]{new Person(1),new Person(4), new Person(2),new Person(7),new Person(9),new Person(8), new Person(3),new Person(0),new Person(1)}; System.out.println("排序前:"+Arrays.toString(ps)); //进行排序 Arrays.sort(ps); System.out.println("排序后:"+Arrays.toString(ps)); }
排序前:[{age=1}, {age=4}, {age=2}, {age=7}, {age=9}, {age=8}, {age=3}, {age=0}, {age=1}]
排序后:[{age=0}, {age=1}, {age=1}, {age=2}, {age=3}, {age=4}, {age=7}, {age=8}, {age=9}]
如果一个类本身并没有实现 Comparable 接口,我们想要对他进行排序,就要自定义 Comparator 比较器进行比较,在这个比较器里面自定义排序的依据。
Comparator 源码中主要的两个接口方法:
1 public interface Comparator<T> 2 { 3 int compare(T o1, T o2); 4 boolean equals(Object obj); 5 }
定义一个用来排序类,该类并为实现 Comparable 接口:
1 private static class Man{ 2 public int age; 3 public Man(int age){ 4 this.age = age; 5 } 6 public String toString() { 7 return "{" + 8 "age=" + age + 9 ‘}‘; 10 } 11 }
进行排序:
1 @Test 2 public void test_1(){ 3 Man[] ps =new Man[]{new Man(1),new Man(4),new Man(2), 4 new Man(7),new Man(9),new Man(8),new Man(3),new Man(0),new Man(1)}; 5 //数组转List 6 ArrayList<Man> ap = new ArrayList<Man>(Arrays.asList(ps)); 7 8 System.out.println("排序前:"+ap); 9 //自定义排序器 10 Collections.sort(ap,new Comparator<Man>() { 11 @Override 12 public int compare(Man o1, Man o2) { 13 //根据年龄进行排序 14 return o1.age - o2.age; 15 } 16 }); 17 18 System.out.println("排序后:"+ ap); 19 }
排序前:[{age=1}, {age=4}, {age=2}, {age=7}, {age=9}, {age=8}, {age=3}, {age=0}, {age=1}]
排序后:[{age=0}, {age=1}, {age=1}, {age=2}, {age=3}, {age=4}, {age=7}, {age=8}, {age=9}]
Comparable 在类的内部定义排序规则,Comparator 在外部定义排序规则,Comparable 相当于“内部排序器”,Comparator 相当于“外部排序器”,前者一次定义即可,后者可以在不修改源码的情况下进行排序,各有所长。
以上是关于Java中Comparable和Comparator比较的主要内容,如果未能解决你的问题,请参考以下文章