天天看點

比較器Comparable與Comparator實踐

比較器Comparable與Comparator實踐

Comparable:該比較器是用于對象的内部比較,比較的是屬性。它的方法:

public int compareTo(T o);
           

Comparator:該比較器用于對象的外部比較,比較的是對象,一般這個比較的對象也實作了Comparable接口。Comparator的方法有多個,但一般我們隻需要實作:

int compare(T o1, T o2);
           

執行個體代碼:

聲明一個People類,實作Comparable接口,内部排序優先級,city>age>name>sex。

public class People implements Comparable<People> {
    public String name;
    public int sex;
    public String city;
    public int age;

    public People(String name, int sex, String city, int age) {
        this.name = name;
        this.sex = sex;
        this.city = city;
        this.age = age;
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", sex=" + sex +
                ", city='" + city + '\'' +
                ", age=" + age +
                '}';
    }

    /**
     * 比較規則優先級:city>age>name>sex
     */
    @Override
    public int compareTo(People people) {

        int result = ;

        if (people == null) return result;

        //比較city
        result = people.city.compareTo(city);//String實作了Comparable接口

        if (result == ) {//city 相同
            result = people.age - age;//比較age
        }

        if (result == ) {//   age相同
            result = people.name.compareTo(name);//比較name
        }

        if (result == ) { //name相同
            result = people.sex - sex;//比較sex
        }

        return result;
    }
}
           

實作一個Comparator比較器

public class PeopleComparator implements Comparator<People> {
    @Override
    public int compare(People people1, People people2) {
        if (people1 != null && people2 != null) {
            return people2.compareTo(people1);//後者和前者比較
        }
        return ;
    }
}
           

測試代碼實作:

public class Test {
    public static void main(String[] args) {
        List<People> list = new ArrayList<>();

        list.add(new People("moly", , "shanghai", ));
        list.add(new People("lili", , "beijing", ));
        list.add(new People("pop", , "shenzhen", ));
        list.add(new People("momo", , "shanghai", 
        ));

        System.out.println(list.toString());

        Collections.sort(list,new PeopleComparator());

        System.out.println(list.toString());
    }
}
           

列印結果:

sort before:[People{name='moly', sex=, city='shanghai', age=}, People{name='lili', sex=, city='beijing', age=}, People{name='pop', sex=, city='shenzhen', age=}, People{name='momo', sex=, city='shanghai', age=}]

sort after:[People{name='lili', sex=, city='beijing', age=}, People{name='momo', sex=, city='shanghai', age=}, People{name='moly', sex=, city='shanghai', age=}, People{name='pop', sex=, city='shenzhen', age=}]