1.1 arraylist.sort(Comparator c)

  • 升序:

    sites.sort(Comparator.naturalOrder());**Comparator 接口的 naturalOrder() 办法指定元素以天然程序(升序)排序。**
  • 降序:

    sites.sort(Comparator.reverseOrder());

Comparator 接口的 reverseOrder() 办法指定以相同的程序(降序)对元素进行排序。

1.2 实现Comparable接口,并重写compareTo()办法:

示例:对Person对象,先依照age升序排列,如果age雷同,再依照name升序排列

重点

class Person implements Comparable<Person>{}

public int compareTo(Person p1){}

Class Person
class Person implements Comparable<Person>{    String name;    int age;    public Person(String name,int age){        this.name =name;        this.age = age;    }    @Override    public String toString(){        return "Person:name="+this.name+" age="+this.age;    }    //treeSet在add一个元素的时候都会在外部调用屡次这个办法,让新填入的元素与已有元素两两进行比拟,最终确定新添入的元素到底放在哪里    @Override    public int compareTo(Person p1) {        //先依照age升序排列,如果age雷同,再依照name升序排列        if(this.age == p1.age){            //字符串默认曾经实现了compareTo办法            return this.name.compareTo(p1.name);        }else{            //升序排列            return this.age -p1.age;        }    }}
test1.java
public class test1 {    public static void main(String[] args) {        //TreeSet有序        TreeSet<Person> set =new TreeSet<>();        //初始化几个实例        set.add(new Person("A",14));        set.add(new Person("E",15));        set.add(new Person("F",12));        set.add(new Person("B",11));        set.add(new Person("G",17));        set.add(new Person("H",15));        set.add(new Person("A",10));        set.add(new Person("C",19));        for (Person person : set) {            System.out.println(person);        }    }}

后果:

1.3 重写comparator比拟器的compare(Object o1,Object o2)办法

这样就不须要实体类继承Comparable<Object>接口

重点:

Class Person 没有继承Comparable接口
class Person{    String name;    int age;    public Person(String name,int age){        this.name =name;        this.age = age;    }    @Override    public String toString(){        return "Person:name="+this.name+" age="+this.age;    }}
Class Mycomparator 继承了Comparator<Object>比拟器,重写compare<Object o1,Object o2>办法
class MyComparator implements Comparator<Person>{    public int compare(Person p1,Person p2){        //先依照age升序排列,如果age雷同,再依照name升序排列        if(p1.age == p2.age){            //字符串默认曾经实现了compareTo办法            return p1.name.compareTo(p2.name);        }else{            //升序排列            return p1.age -p2.age;        }    }}
test1.java 在treeSet对象初始化的时候,就传入一个Comparator比拟器,用来对treeSet外部的元素进行比拟

==重点:== TreeSet<Person> set =new TreeSet<Person>(new MyComparator());

public class test1 {    public static void main(String[] args) {        //TreeSet有序        TreeSet<Person> set =new TreeSet<Person>(new MyComparator());        //初始化几个实例        set.add(new Person("A",14));        set.add(new Person("E",15));        set.add(new Person("F",12));        set.add(new Person("B",11));        set.add(new Person("G",17));        set.add(new Person("H",15));        set.add(new Person("A",10));        set.add(new Person("C",19));        for (Person person : set) {            System.out.println(person);        }    }}

1.4 重写comparator比拟器,匿名外部类的形式,不须要Mycomparator类

  • Person类和1.3雷同
  • 删除Mycomparator类
  • test1.java 应用匿名外部类的形式重写comparator比拟器

    写法:

    TreeSet<Person> set =new TreeSet<Person>(new Comparator<Person>(){    @Override    public int compare(Person p1, Person p2){            }};

    实在代码:

    public class test1 {    public static void main(String[] args) {        //TreeSet有序        TreeSet<Person> set =new TreeSet<Person>(new Comparator<Person>() {            @Override            public int compare(Person p1, Person p2) {                if(p1.age==p2.age){                    //字符串默认曾经实现了compareTo办法                    return p1.name.compareTo(p2.name);                }                else{                    return p1.age-p2.age;                }            }        });        //初始化几个实例        set.add(new Person("A",14));        set.add(new Person("E",15));        set.add(new Person("F",12));        set.add(new Person("B",11));        set.add(new Person("G",17));        set.add(new Person("H",15));        set.add(new Person("A",10));        set.add(new Person("C",19));        for (Person person : set) {            System.out.println(person);        }    }}

1.5 对于List类或者数组,重写comparator形式不同

  • Person类和1.3雷同
  • 删除Mycomparator类
  • 先申明ArrayList对象,应用Collectons.sort(对象名,new Comparator<Person>){}办法重写comparator并排序。

    test1.java
    public class test1 {    public static void main(String[] args) {        ArrayList<Person> a=new ArrayList<>();        //初始化几个实例        a.add(new Person("A",14));        a.add(new Person("E",15));        a.add(new Person("F",12));        a.add(new Person("B",11));        a.add(new Person("G",17));        a.add(new Person("H",15));        a.add(new Person("A",10));        a.add(new Person("C",19));        Collections.sort(a, new Comparator<Person>() {            @Override            public int compare(Person p1, Person p2) {                if(p1.age==p2.age){                    //字符串默认曾经实现了compareTo办法                    return p1.name.compareTo(p2.name);                }                else{                    return p1.age-p2.age;                }            }        });        for (Person person : a) {            System.out.println(person);        }    }}
  • 留神:如果是数组,重写的形式是这样的:

    Arrays.sort(数组名, new Comparator<数组元素类型>() {            @Override            public int compare(数组元素类型 p1, 数组元素类型 p2) {                //规定            }});