天天看點

Java中Comparable和Comparator實作對象簡單比較

當需要排序的集合或數組不是單純的數字型時,通常可以使用Comparator或Comparable,以簡單的方式實作對象排序或自定義排序。

對字元串List可以直接sort進行排序, 那是因為String 這個對象已經幫我們實作了 Comparable接口 , 是以我們的 Person 如果想排序, 也要實作一個比較器。

一. Comparator

對Linkedlist存儲的對象進行排序

import java.util.Comparator;
import java.util.LinkedList;
class Person{
    private float height;
    private String name;
    
    Person(float height)
    {
        this.height=height;
    }
    public float getHeight() {
        return height;
    }
    public void setHeight(float height) {
        this.height = height;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
class PersonHeight implements Comparator<Person>{
     
    @Override
    //重寫compare方法,return<0不變,return>0則交換順序(保持升序)
    public int compare(Person e1, Person e2) {
        if(e1.getHeight() < e2.getHeight()){
            return 1;
        } else {
            return -1;
        }
    }
}
public class Question3 {
    public static void main(String[] args) {
        Person p1=new Person(23.4f);
        p1.setName("Stud1");
        Person p2=new Person(2.34f);
        p2.setName("Stud2");
        Person p3=new Person(34.32f);
        p3.setName("Stud3");
        Person p4=new Person(56.45f);
        p4.setName("Stud4");
        Person p5=new Person(21.4f);
        p5.setName("Stud5");
        
        LinkedList<Person> al=new LinkedList<Person>();
        al.add(p1);
        al.add(p2);
        al.add(p3);
        al.add(p4);
        al.add(p5);
        
                //調用sort方法,實作排序
        Collections.sort(al, new PersonHeight());
        
                //周遊輸出
        for(Person p:al)
            System.out.println(p.getName());
    }
}
           
//對日期進行排序
/**
 * 如果o1小于o2,傳回一個負數;如果o1大于o2,傳回一個正數;如果他們相等,則傳回0;
 */
@Override
public int compare(Step o1, Step o2) {
    Date acceptTime1=UtilTool.strToDate(o1.getAcceptTime(), null);
    Date acceptTime2=UtilTool.strToDate(o2.getAcceptTime(), null);
    
    //對日期字段進行升序,如果欲降序可采用before方法
    if(acceptTime1.after(acceptTime2)) return 1;
    return -1;
}
           

二. Comparable

import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
class Person implements Comparable{
    private float height;
    private String name;
    
    Person(float height)
    {
        this.height=height;
    }
    public float getHeight() {
        return height;
    }
    public void setHeight(float height) {
        this.height = height;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        if(this.height>((Person)o).height){
            return 1;
        }else
        return -1;
    }
    
}
public class Question3 {
    public static void main(String[] args) {
        Person p1=new Person(23.4f);
        p1.setName("Stud1");
        Person p2=new Person(2.34f);
        p2.setName("Stud2");
        Person p3=new Person(34.32f);
        p3.setName("Stud3");
        Person p4=new Person(56.45f);
        p4.setName("Stud4");
        Person p5=new Person(21.4f);
        p5.setName("Stud5");
        
        LinkedList<Person> al=new LinkedList<Person>();
        al.add(p1);
        al.add(p2);
        al.add(p3);
        al.add(p4);
        al.add(p5);
        
        Collections.sort(al);
        
        for(Person p:al)
            System.out.println(p.getName());
    }
}
           

三.比較

Comparable 定義在 Person類的内部。

Comparator 是定義在Person的外部的, 此時我們的Person類的結構不需要有任何變化。

兩種方法各有優劣, 用Comparable 簡單, 隻要實作Comparable 接口的對象直接就成為一個可以比較的對象,

但是需要修改源代碼, 用Comparator 的好處是不需要修改源代碼, 而是另外實作一個比較器, 當某個自定義

的對象需要作比較的時候,把比較器和對象一起傳遞過去就可以比大小了, 并且在Comparator 裡面使用者可以自

己實作複雜的可以通用的邏輯,使其可以比對一些比較簡單的對象,那樣就可以節省很多重複勞動了。