歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java中的排序Comparable接口和Comparator接口

普通的類要實現排序,必須實現Comparable接口,並重寫CompareTo()方法。
package test;
public class Field implements Comparable<Field> {
    private String name;
    private int age;
    public Field() {
    }
    public Field(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(Field o) {
        // 先按age排序
        if (this.age > o.getAge()) {
            return (this.age - o.getAge());
        }
        if (this.age < o.getAge()) {
            return (this.age - o.getAge());
        }
        // 按name排序
        if (this.name.compareTo(o.getName()) > 0) {
            return 1;
        }
        if (this.name.compareTo(o.getName()) < 0) {
            return -1;
        }
        return 0;
    }
}
package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test2 {
    public static void main(String[] args) {
        Field f1 = new Field("tony", 11);
        Field f2 = new Field("jack", 11);
        Field f3 = new Field("tom", 11);
        Field f4 = new Field("jason", 44);
        List<Field> list = new ArrayList<Field>();
        list.add(f1);
        list.add(f3);
        list.add(f4);
        list.add(f2);
        Collections.sort(list);
        for (Field o : list) {
            System.out.println(o.getAge() + "-->" + o.getName());
        }
    }
}

Comparator

package com.tianjf; 
       
    import java.util.Arrays; 
    import java.util.Comparator; 
       
    public class MyComparator implements Comparator<Object> { 
       
        @Override 
        public int compare(Object o1, Object o2) { 
            return toInt(o1) - toInt(o2); 
        } 
       
        private int toInt(Object o) { 
            String str = (String) o; 
            str = str.replaceAll("一", "1"); 
            str = str.replaceAll("二", "2"); 
            str = str.replaceAll("三", "3"); 
            return Integer.parseInt(str); 
        }

        /**
        * 測試方法
        */ 
     

public static void main(String[] args) { 
            String[] array = new String[] { "一", "三", "二" }; 
            Arrays.sort(array, new MyComparator()); 
            for (int i = 0; i < array.length; i++) { 
                System.out.println(array[i]); 
            } 
        } 
    }

相信在看了代碼以後就應該明白些了吧,現在再簡單說一下Comparable接口和Comparator接口之間的區別(純屬個人想法)。我覺得Comparable接口的最大作用就在於定義一個自定義的類的比較規則,因為CompareTo方法只有一個參數,另一個參數是this,也就是這個類本身,所以我們可以把它看成是在類的內部定義比較規則,相當於Java開發人員在寫String類的時候就應該讓它實現Comparable接口。然而,compare方法有兩個參數,這兩個參數可以是任意類型的,可以是已經定義過的String類型,也可以是自定義的類型。如果是已經定義過的類型,compare方法可以對它的規則進行重新定義,如果是自定義的類型,可以新定義一個規則。
 
總結:
comparable是支持自比較,而後者是支持外部比較;

comparable&  Comparator    都是用來實現集合中的排序的,只是Comparable是在集合內部定義的方法實現的排序,Comparator是在集合外部實現的排序,所以,如想實現排序,就需要在集合外定義Comparator接口的方法compare()或在集合內實現Comparable接口的方法compareTo()。

Comparable是一個對象本身就已經支持自比較所需要實現的接口(如String    Integer自己就可以完成比較大小操作)   
   
而Comparator是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能滿足你的要求時,你可以寫一個比較器來完成兩個對象之間大小的比較。

也就是說當你需要對一個自定義的類的一個數組或者集合進行比較的時候可以實現Comparable接口,當你需要對一個已有的類的數組或者集合進行比較的時候就一定要實現Comparator接口。另外,這兩個接口是支持泛型的,所以我們應該在實現接口的同時定義比較類型。

Copyright © Linux教程網 All Rights Reserved