1.相同点

都是java的一个接口,都是用来对自定义的class来比较大小的

什么是自定义的class:

比如定义一个Person类,里面有name,age

当我们创造一个personlist的时候,里面有很多个person1,2,3,那么我们想要对其进行自定义的排序,如按照名字或者年龄升序降序排列

怎么办?就用这两个类接口!

最后都调用:Collections.sort(...)方法进行集合的排序!

 

2.不同点

2.1.Comparable

直接定义在Person类上面,然后重写compareTo()

public class Person implements Comparable<Person>{
    int age;
    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;
    }
}

然后在另外一个类中使用:

package dayN;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

public class ComparableTest implements Iterable{

    public static void main(String[] args) {
        Person p1 = new Person(20,"张三");
        Person p2 = new Person(19,"李三");
        ArrayList arrayList = new ArrayList();
        arrayList.add(p1);
        arrayList.add(p2);
        Collections.sort(arrayList); //此时调用这个Collections.sort()或者Arrays.sort(),这时候会按照我们定义的排序方式进行排序
        Iterator it = arrayList.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }

    @Override
    public Iterator iterator() {
        return null;
    }
}

就可以得到按照年龄排序的集合

 

2.2.Comparator

定义在另外一个类里面

比如在Person2类里:

package dayN;

public class Person2{

    int age;
    String name;

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

只需要定义这个Person的各个属性,不需要实现Comparator接口,对于Person类是不需要实现任何变化的

而在另外一个类中实现:

package dayN;

import java.util.Comparator;

public class Person2Comparator  implements Comparator<Person2> {

    @Override
    public int compare(Person2 o1, Person2 o2) {
        return o1.age - o2.age;
    }
}

(按照年龄从小到大排列)

最后在使用的方法中,调用Collections.sort(personlist,new Person2Comparator())

package dayN;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

public class ComparatorTest implements Iterable{
    public static void main(String[] args) {
        Person2 p1 = new Person2(18,"张三");
        Person2 p2 = new Person2(19,"李三");
        ArrayList arrayList = new ArrayList();
        arrayList.add(p1);
        arrayList.add(p2);
        Collections.sort(arrayList,new Person2Comparator());
        Iterator it = arrayList.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }

    @Override
    public Iterator iterator() {
        return null;
    }
}

 

3.拓展

有些情况可能会出现:

如果年龄相同,那么这时候怎么排序?

按照姓名或者其他属性排序!

怎么做?

我们可以先遵守年龄的升序排列,然后年龄一样时,再进行名字的升序排列

3.1.利用Comparable接口时

将compareTo(Person person)重写成这样:

package dayN;

public class Person implements Comparable<Person>{
    int age;
    String name;

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

    @Override
    public int compareTo(Person person) {
        if (this.age == person.age){
            if (this.name.compareTo(person.name) > 0){
                return 1;
            }else if (this.name.compareTo(person.name) < 0){
                return -1;
            }else {
                return 0;
            }
        }
        return this.age - person.age;
    }
}

3.2.Comparator接口时同理

package dayN;

import java.util.Comparator;

public class Person2Comparator  implements Comparator<Person2> {

    @Override
    public int compare(Person2 o1, Person2 o2) {
        if (o1.age == o2.age){
            if (o1.name.compareTo(o2.name) > 0){
                return 1;
            }else if (o1.name.compareTo(o2.name) < 0){
                return -1;
            }else {
                return 0;
            }
        }
        return o1.age - o2.age;
    }
}

 

 posted on 2020-11-19 18:01  又在化学楼迷路了  阅读(102)  评论(0)    收藏  举报