Comparable Comparable:是一个排序接口。内部只有一个comparaTo(T o)的方法,所以,直接在需要排序的类上直接实现该接口。因此,Comparable又被称为内比较器。 public interface Comparable<T> {
public int compareTo(T o);
}说明: 如果一个类实现了Comparable接口,可以直接使用Collections.sort()/Arrays.sort()去进行排序。下面,讲使用Person类(属性:String name,int age)去进行演示。 Person类: public class Person implements Comparable<Person>{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person() {
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int compareTo(Person o) {
return this.age - o.getAge();
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}演示1:重写compareTo(T o )方法,并且,使用的是this.age - o.getAge();
public int compareTo(Person o) {
return this.age - o.getAge();
}
---------------------------------------------------------------------------------
public class Test01 {
public static void main(String[] args) {
Person p1 = new Person(18, "t1");
Person p2 = new Person(15, "t2");
Person p3 = new Person(66, "t3");
/* ArrayList<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
System.out.println(list);
Collections.sort(list);
System.out.println(list);*/
Person[] list = {p1,p2,p3};
System.out.println("排序前");
for (Person arr : list) {
System.out.println(arr);
}
Arrays.sort(list);
System.out.println("排序后");
System.out.println("-------------");
for (Person arr : list) {
System.out.println(arr);
}
}
}
结果1: 排序前
Person{age=18, name='t1'}
Person{age=15, name='t2'}
Person{age=66, name='t3'}
排序后
-------------
Person{age=15, name='t2'}
Person{age=18, name='t1'}
Person{age=66, name='t3'}结果1分析: 如果重写方法的时候,使用的是this.age - o.getAge()的话,排序结果是升序的。
演示2:重写compareTo(T o )方法,并且,使用的是o.getAge() - this.getAge() public int compareTo(Person o) {
return o.age - this.getAge();
}
-------------------------------------------------------------------------
public class Test01 {
public static void main(String[] args) {
Person p1 = new Person(18, "t1");
Person p2 = new Person(15, "t2");
Person p3 = new Person(66, "t3");
ArrayList<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
System.out.println("排序前");
for (Person arr : list) {
System.out.println(arr);
}
Collections.sort(list);
System.out.println("排序后");
System.out.println("-------------");
for (Person arr : list) {
System.out.println(arr);
}
}
}
结果2: 排序前
Person{age=18, name='t1'}
Person{age=15, name='t2'}
Person{age=66, name='t3'}
排序后
-------------
Person{age=66, name='t3'}
Person{age=18, name='t1'}
Person{age=15, name='t2'}结果2分析: 如果重写方法的时候,使用的是o.getAge() - this.age的话,排序结果是倒序的。
演示3:根据name属性进行排序,如果name相同,再根据age去排序 public int compareTo(Person o) {
if (name.equals(o.getName())){
return age - o.getAge();
}else{
return name.compareTo(o.getName()) ;
}
}
-----------------------------------------------------------------
public class Test01 {
public static void main(String[] args) {
Person p1 = new Person(18, "t3");
Person p2 = new Person(15, "a2");
Person p3 = new Person(66, "b1");
Person p4= new Person(55, "b1");
Person p5= new Person(44, "b2");
ArrayList<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
System.out.println("排序前");
for (Person arr : list) {
System.out.println(arr);
}
Collections.sort(list);
System.out.println("排序后");
System.out.println("-------------");
for (Person arr : list) {
System.out.println(arr);
}
}
}结果3:
排序前
Person{age=18, name='t3'}
Person{age=15, name='a2'}
Person{age=66, name='b1'}
Person{age=55, name='b1'}
Person{age=44, name='b2'}
排序后
-------------
Person{age=15, name='a2'}
Person{age=55, name='b1'}
Person{age=66, name='b1'}
Person{age=44, name='b2'}
Person{age=18, name='t3'}结果3分析: 重写方法之后,按照名字的字母先后先排序名字如果相同的话,就按照年龄去比较。
ComparatorComparator:是一个比较器。它一般不是直接在要比较的类上面实现接口的。而是通过创建一个新的比较类去实现这个接口,然后实现compare(T o1 ,T o2)这个方法去进行比较。因此,它也被称为外部比较器。
说明: 如果 o1 - o2 值是正数,那么代表 o1比o2大
如果 o1 - o2 值是0,那么代表 o1和o2相等
如果 o1 - o2 值是负数,那么代表 o1比o2小
下面,讲使用Person类(属性:String name,int age)去进行演示。 Person类: public class Person{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person() {
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
比较器类 public class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
}演示4:重写compare(T o1,T o2)方法,比较的是o1.getAge () - o2.getAge(); public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
--------------------------------------------------------------------
public class Test01 {
public static void main(String[] args) {
Person p1 = new Person(18, "t3");
Person p2 = new Person(15, "a2");
Person p3 = new Person(66, "b1");
Person p4= new Person(55, "b1");
Person p5= new Person(44, "b2");
ArrayList<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
System.out.println("排序前");
for (Person arr : list) {
System.out.println(arr);
}
Collections.sort(list,new PersonComparator());
System.out.println("排序后");
System.out.println("-------------");
for (Person arr : list) {
System.out.println(arr);
}
}
}结果4: 排序前
Person{age=18, name='t3'}
Person{age=15, name='a2'}
Person{age=66, name='b1'}
Person{age=55, name='b1'}
Person{age=44, name='b2'}
排序后
-------------
Person{age=15, name='a2'}
Person{age=18, name='t3'}
Person{age=44, name='b2'}
Person{age=55, name='b1'}
Person{age=66, name='b1'}结果4分析: 按照年龄去排序。而且 ,如果o1.getAtge() - o2.getAge()的话,排序结果是升序。演示5:重写compare(T o1, T o2)的方法,重写内容以及测试代码如下: public int compare(Person o1, Person o2) {
return o2.getAge() - o1.getAge();
}
------------------------------------------------------------------------
public class Test01 {
public static void main(String[] args) {
Person p1 = new Person(18, "t3");
Person p2 = new Person(15, "a2");
Person p3 = new Person(66, "b1");
Person p4= new Person(55, "b1");
Person p5= new Person(44, "b2");
ArrayList<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
System.out.println("排序前");
for (Person arr : list) {
System.out.println(arr);
}
Collections.sort(list,new PersonComparator());
System.out.println("排序后");
System.out.println("-------------");
for (Person arr : list) {
System.out.println(arr);
}
}
}
结果5: 排序前
Person{age=18, name='t3'}
Person{age=15, name='a2'}
Person{age=66, name='b1'}
Person{age=55, name='b1'}
Person{age=44, name='b2'}
排序后
-------------
Person{age=66, name='b1'}
Person{age=55, name='b1'}
Person{age=44, name='b2'}
Person{age=18, name='t3'}
Person{age=15, name='a2'} 结果5分析: 如果是 o2.getAge() - o1.getAge()的话,那么排序结果是降序
演示6:根据name属性进行排序,如果name相同,再根据age去排序 public int compare(Person o1, Person o2) {
if(o1.getName().equals(o2.getName())){
return o2.getAge() - o1.getAge();
}else{
return o1.getName().compareTo(o2.getName());
}
}
-----------------------------------------------------------------------
public class Test01 {
public static void main(String[] args) {
Person p1 = new Person(18, "t3");
Person p2 = new Person(15, "a2");
Person p3 = new Person(66, "b1");
Person p4= new Person(55, "b1");
Person p5= new Person(44, "b2");
ArrayList<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
System.out.println("排序前");
for (Person arr : list) {
System.out.println(arr);
}
Collections.sort(list,new PersonComparator());
System.out.println("排序后");
System.out.println("-------------");
for (Person arr : list) {
System.out.println(arr);
}
}
}结果6: 排序前
Person{age=18, name='t3'}
Person{age=15, name='a2'}
Person{age=66, name='b1'}
Person{age=55, name='b1'}
Person{age=44, name='b2'}
排序后
-------------
Person{age=15, name='a2'}
Person{age=66, name='b1'}
Person{age=55, name='b1'}
Person{age=44, name='b2'}
Person{age=18, name='t3'}结果6分析: 如果name不同,就按照字母先后的顺序去排,如果名字相同了就比较年龄。
总结: 如果使用的是Comparable的话,直接是在需要比较的类上实现接口,然后,在内部重写compareTo的方法进行自己的比较。可以直接使用Collections.sort()/Arrays.sort()的方法
如果使用的是Comparator的话,不能直接在需要比较的类上实现接口,需要在另外一个类上实现Comparator的接口,然后重写compare(T o1 ,T o2)的方法。
|