A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Mylo 黑马粉丝团   /  2019-4-16 18:22  /  1016 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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分析:
重写方法之后,按照名字的字母先后先排序名字如果相同的话,就按照年龄去比较。

Comparator
Comparator:是一个比较器。它一般不是直接在要比较的类上面实现接口的。而是通过创建一个新的比较类去实现这个接口,然后实现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)的方法。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马