天天看點

comparable和comparator的差別(代碼實作比較兩個person)

  兩者都是java的比較器。不過 comparable,需要被比較的類自己去實作排序邏輯;comparator不需要。

Comparator和Comparable的差別

參數 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

----------

實作比較person,先按年齡排,年齡相同的按工資排。

------

1.comparable 實作。(person類實作Comparable接口,實作比較方法compareTo,比較時使用Conllections.sort(list)即可 )

package com.fjf.test;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

public class TestComparable {

    public static void main(String[] args) {

         List<Person> list = new ArrayList<Person>();

         list.add(new Person("張三", 50,"男",500.00));

         list.add(new Person("李四", 27,"女",800.00));

         list.add(new Person("王五", 33,"男",500.00));

         list.add(new Person("趙六", 33,"男",1000.00));

         list.add(new Person("付8", 33,"男",500.00));

         for (Person p : list) {

                System.out.println(p);

            }

         System.out.println("--------Comparable比較----------");

        Collections.sort(list);

        for (Person p : list) {

            System.out.println(p);

        }

    }

}

class Person implements Comparable<Person>{

    private String name;

    private int age;

    private String sex;

    private double salary;

    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;

    }

    public String getSex() {

        return sex;

    }

    public void setSex(String sex) {

        this.sex = sex;

    }

    public double getSalary() {

        return salary;

    }

    public void setSalary(double salary) {

        this.salary = salary;

    }

    public Person(String name, int age, String sex,double salary) {

        super();

        this.name = name;

        this.age = age;

        this.sex = sex;

        this.salary = salary;

    }

    public Person() {

        super();

    }

    @Override

    public int compareTo(Person o) {

        int ageCompare = this.age - o.age;

        if(ageCompare==0){ //年齡相同 用工資排

            int salaryCompare = (this.salary - o.salary)>0.00?-1:1; //工資如果再相同就不管了

            System.out.println(salaryCompare);

            return salaryCompare;

        }

        return ageCompare;

        //return o.age -this.age;

        //this.compareTo(o.age);

        //this.getAge().compareTo(o.getAge());

        //this.name.compareTo(anotherString)

    }

    @Override

    public String toString() {

        return "Person [name=" + name + ", age=" + age + ", sex=" + sex

                + ", salary=" + salary + "]";

    }

}

comparable和comparator的差別(代碼實作比較兩個person)

--------------------------------

2.comparator實作。(pesron類自己無需實作任何比較邏輯。在真正比較時,Conllections.sort(list,Comparator)在傳入一個comparator比較器實作比較邏輯)

package com.fjf.test;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

public class TestComparator {

    public static void main(String[] args) {

        List<Person2> list = new ArrayList<Person2>();

         list.add(new Person2("張三", 50,"男",500.00));

         list.add(new Person2("李四", 27,"女",800.00));

         list.add(new Person2("王五", 33,"男",500.00));

         list.add(new Person2("趙六", 33,"男",1000.00));

         list.add(new Person2("付8", 33,"男",500.00));

         for (Person2 p : list) {

                System.out.println(p);

            }

         System.out.println("---------Comparator比較----------");

         Collections.sort(list, new Comparator<Person2>() {

            @Override

            public int compare(Person2 o1, Person2 o2) {

                int ageCompare = o1.getAge()-o2.getAge();

                if(ageCompare == 0){

                    int salaryCompare = (o1.getSalary()-o2.getSalary()>0.00?1:-1);

                    return salaryCompare;

                }

                return ageCompare;

            }

        });

         for (Person2 p : list) {

                System.out.println(p);

            } 

    }

}

     class Person2 {

        private String name;

        private int age;

        private String sex;

        private double salary;

        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;

        }

        public String getSex() {

            return sex;

        }

        public void setSex(String sex) {

            this.sex = sex;

        }

        public double getSalary() {

            return salary;

        }

        public void setSalary(double salary) {

            this.salary = salary;

        }

        public Person2(String name, int age, String sex, double salary) {

            super();

            this.name = name;

            this.age = age;

            this.sex = sex;

            this.salary = salary;

        }

        public Person2() {

            super();

        }

        @Override

        public String toString() {

            return "Person [name=" + name + ", age=" + age + ", sex=" + sex

                    + ", salary=" + salary + "]";

        }

    }

comparable和comparator的差別(代碼實作比較兩個person)
comparable和comparator的差別(代碼實作比較兩個person)

---

附:網友的一些介紹。

https://blog.csdn.net/u013256816/article/details/50899416/

https://blog.csdn.net/u014133299/article/details/78608454