天天看點

Java-Comparable、Comparator接口——比較器的使用一、Comparable:自然排序二、Comparator:定制排序三、Comparable和Comparator使用的對比

比較器

  • 一、Comparable:自然排序
    • 1、概述
    • 2、用法說明
  • 二、Comparator:定制排序
    • 1、概述
    • 2、用法說明
  • 三、Comparable和Comparator使用的對比

一、Comparable:自然排序

1、概述

Comparable接口強行對實作它的每個類的對象進行整體排序。這種排序被稱為類的自然排序。

2、用法說明

  • 實作Comparable的類必須實作comparaTo(Object obj)方法,兩個對象即通過comparaTo(Object obj)方法的傳回值來比較大小。如果目前對象this大于形參對象obj,則傳回正整數;如果目前對象this小于形參對象obj,則傳回負整數;如果目前對象this等于形參對象obj,則傳回零。
  • 實作Comparable接口的對象清單(和數組)可以通過Collections.sort或Arrays.sort進行自動排序。實作此接口的對象可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器。
  • 對于類C的每一個e1和e2來說,當且僅當e1.comparableTo(e2) == 0與e1.equals(e2)具有相同的boolean值時,類C的自然排序才叫做與equals一緻。建議(雖然不是必須的)最好使自然排序與equals一緻。

二、Comparator:定制排序

1、概述

當元素的類型沒有實作java.lang.Comparable接口而又不友善修改代碼,或者實作了java.lang.Comparable接口的排序規則不适合目前的操作,那麼可以考慮使用Comparator的對象來排序,強行對多個對象進行整體排序的比較。

2、用法說明

  • 重寫compara(Object o1,Object o2)方法,比較o1和o2的大小: 如果方法傳回正整數,則表示o1大于o2;如果方法傳回0整數,則表示相等;如果方法傳回負整數,則表示o1小于o2。
  • 可以将Comparator傳遞給sort方法(如Collections.sort或Arrays.sort),進而允許在排序順序上實作精準控制。
  • 還可以使用Comparator來控制某些資料結構(如有序set或有序映射)的順序,或者為那些沒有自然順序的對象collection提供排序。
@Test
    public void test1() {
        String[] arr = new String[]{"MM", "GG", "KK","AA","CC","JJ","DD"};
        Arrays.sort(arr, new Comparator<String>() {
            //按照字元串從大到小的順序排序
            @Override
            public int compare(String o1, String o2) {
                if (o1 instanceof String && o2 instanceof String){
                    String s1 = (String) o1;
                    String s2 = (String) o2;
                    return -s1.compareTo(s2);
                }
                throw new RuntimeException("輸入的資料類型不一緻");
            }
        });
        System.out.println(Arrays.toString(arr));
    }
           

三、Comparable和Comparator使用的對比

  1. Comparable接口的方式一旦确定,保證Comparable接口實作類的對象在任何位置都可以比較大小。
  2. Comparator接口屬于臨時性的比較。(如匿名内部類實作)

繼續閱讀