1. 程式人生 > 其它 >Comparable和Comparator淺談

Comparable和Comparator淺談

Comparable和Comparator


前言

Comparable是一個排序介面,若一個類實現了Comparable介面,就可以根據自己想要的排序,去重寫compareTo方法去實現
Comparator相當於一種通用的工具類介面。需要定製一個比較類去實現它,重寫compare方法去實現。

一、Comparable

定義一個簡單的學生類,來根據年齡大小來給學生排序

public class Test2 {
    public static void main(String[] args) {
        Person[
] people= { new Person("YY",18), new Person("LY",21), new Person("MY",19)}; Arrays.sort(people); System.out.println(Arrays.toString(people)); } } class Person implements Comparable<Person>{ private
String name; private int age; public Person(String name, int age) { 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 int compareTo(Person o) { return this.age-o.age; } @Override public String toString() { return "name :"+name+","+"age :"+age; } }

在這裡插入圖片描述

重寫compareTo方法,通過當前物件和引數的比較
二者相等是 return 0;
當前物件比引數大時 return 1;
當前物件比引數小時 return -1;
Comparable是排序介面;若一個類實現了Comparable介面,就意味著”該類支援排序。
最後根據自己的需求,重寫compareTo方法就好了。


二、Comparator

import java.util.*;
//定義一個學生類  有姓名,年齡,性別
public class Person4 {
    private String name;
    private int age;
    private String sex;

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

    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;
    }

    @Override
    public String toString() {
        return "name:"+name+","+"age:"+age+","+"sex:"+sex;
    }
}
//實現了Comparator 介面 重寫compare方法
 class Person4Comparator implements Comparator<Person4> {
    @Override
    public int compare(Person4 o1, Person4 o2) {
       return o1.getAge()-o2.getAge();
    }
}
//測試類
class test{
    public static void main(String[] args) {
        List<Person4> list=new ArrayList<>();
        Person4 p1=new Person4("YY",18,"nv");
        Person4 p2=new Person4("LY",21,"nan");
        Person4 p3=new Person4("XY",22,"nv");
        list.add(p1);
        list.add(p2);
        list.add(p3);
        //定義一個比較器
        Person4Comparator comparator=new Person4Comparator();

        Collections.sort(list,comparator);
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
    }
}

在這裡插入圖片描述

三、區別

Comparable 是 java.lang.包下的 Comparator是java.util.包下的
Comparable是需要比較的物件來實現介面,需要改變物件的內部結構,破壞性大。
Comparator是一種通用的比較工具類介面,物件不需要做任何改變,只需要為需要比較類,量身定製一個比較器即可,比較靈活。

實際的使用中,如果希望一個類的比較方式有很多種,而且比較方式具有外部擴充套件性,那麼可以實現Comparator介面,如果一個類預設的實現了Comparable介面,而你又希望再定義一個比較規則,那麼你不可能去修改原類,因為這樣會破壞封閉開放原則,最好的方法是寫一個實現了Comparator介面的類。總的來說,Comparator介面比Comparable介面要靈活。