12、Comparable和Comparator使用区别

编程题目:

12.分别使用Comparable和Comparator对两个类Person1和Person2进行排序。要求:先通过姓名进行排序,如果姓名相同,再通过年龄进行排序。

示例代码:

package program.collection.exercise12;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * Comparable和Comparator的区别
 *
 *  参数          Comparable                          Comparator
 *  排序逻辑        排序逻辑必须在待排序对象的类中,故称之为自然排序    排序逻辑在另一个实现
 *  实现          实现Comparable接口                      实现Comparator接口
 *  排序方法        int compareTo(Object o1)            int compare(Object o1,Object o2)
 *  触发排序        Collections.sort(List)              Collections.sort(List, Comparator)
 *  接口所在包       java.lang.Comparable                java.util.Comparator
 *
 *  Comparable是排序接口;若一个类实现了 Comparable 接口,就意味着 “该类支持排序”。而 Comparator 是比较器;
 *  我们若需要控制某个类的次序,可以建立一个 “该类的比较器” 来进行排序。 
 *  前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于 “静态绑定”,而后者可以 “动态绑定”。 
 *  我们不难发现:Comparable 相当于 “内部比较器”,而 Comparator 相当于 “外部比较器”。
 *
 *  注意:
 *  -(横杠)用于比较int类型:int age = o1.getAge()-o2.getAge();
 *  compareTo()可用于比较int和String类型:int name = o1.getName().compareTo(o2.getName());
 *  返回值为-1:表示左边小于右边
 *  返回值为0:表示左边等于右边
 *  返回值为1:表示左边大于右边
 */

/**
 * 12.分别使用Comparable和Comparator对两个类Person1和Person2(不可改变类)进行排序。
 *    要求:先通过姓名进行排序,如果姓名相同,再通过年龄进行排序。
 *   Person1(String name,int age):"a",18 "b",19 "a",17
 *   Person2(String name,int age):"a",19 "a",18 "b",17
 */

public class PersonCompare {
    public static void main(String[] args) {

        System.out.println("Comparable测试:");
        List list = new ArrayList();
        list.add(new Person1("a",18));
        list.add(new Person1("b",19));
        list.add(new Person1("a",17));
        System.out.println(list);
        Collections.sort(list);
        System.out.println(list);

        System.out.println("Comparator测试:");
        List list2 = new ArrayList();
        list2.add(new Person2("a",19));
        list2.add(new Person2("a",18));
        list2.add(new Person2("b",17));
        System.out.println(list2);
        Collections.sort(list2, new Comparator() {

            @Override
            public int compare(Person2 o1, Person2 o2) {
                int name = o1.getName().compareTo(o2.getName());
                if(name == 0){
                    return o1.getAge()-o2.getAge();
                }
                return name;
            }
        });
        System.out.println(list2);

    }
}

//可修改Person1类
class Person1 implements Comparable {

    private String name;
    private int age;

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

    @Override
    public String toString() {
        return name + ":" + age;
    }

    @Override
    public int compareTo(Person1 o) {
        int name = this.name.compareTo(o.name);
        if(name == 0){
            return this.age-o.age;
        }
        return name;
    }

}

//不可修改Person2类
final class Person2 {

    private String name;
    private int age;

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

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return name + ":" + age;
    }

}

结果显示:

12、Comparable和Comparator使用区别_第1张图片

你可能感兴趣的:(Java编程(Java,Program),#,Java编程02:集合,Java,编程,集合)