1. 程式人生 > 程式設計 >詳解Java比較器

詳解Java比較器

正文

Java中的物件正常情況下只能進行比較 == 或者 != 不能使用 > < ,但是在實際的開發中,我們需要對多個物件進行排序,就是需要比較物件的大小

Java實現物件排序的方式有兩種:

  • 自然排序:java.lang.Comparable
  • 定製排序:java.util.Comparator

1. Comparable 自然排序

  • 像String、包裝類等實現了Comparable介面,重寫了compareTo(obj)方法,給出了比較兩個物件大小的方式。
  • 像String、包裝類重寫compareTo()方法以後,進行了從小到大的排列
  • 重寫compareTo(obj)的規則:

如果當前物件this大於形參物件obj,則返回正整數
如果當前物件this小於形參物件obj,則返回負整數
如果當前物件this等於形參物件obj,則返回零

  • 對於自定義類來說,如果需要排序,我們可以讓自定義類實現Comparable介面,重寫compareTo(obj)方法。在compareTo(obj)方法中指明如何排序,預設也是從小到大
public void test1(){
    String[] arr = new String[]{"AA","BB","DD","WW","MM","PP","CC"};
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));//[AA,BB,CC,DD,MM,PP,WW]
  }

自定義類需要重寫

package com.atguigu.java1;

/**
 * @author MD
 * @create 2020-07-13 15:52
 */
public class Goods implements Comparable{
  private String name;
  private double price;

  public Goods() {
  }

  public Goods(String name,double price) {
    this.name = name;
    this.price = price;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public double getPrice() {
    return price;
  }

  public void setPrice(double price) {
    this.price = price;
  }

  @Override
  public String toString() {
    return "Goods{" +
        "name='" + name + '\'' +
        ",price=" + price +
        '}';
  }

  // 指明商品比較大小的方式:按照價格的方式從小到大,再按照商品名從低到高
  @Override
  public int compareTo(Object o) {
    if(o instanceof Goods){
      Goods goods = (Goods)o;
      // 方式一
      if (this.price > goods.price){
        return 1;
      }else if(this.price < goods.price){
        return -1;
      }else{
        //return 0;
        return this.name.compareTo(goods.name);
      }
      // 方式二:
      //return Double.compare(this.price,goods.price);
    }

    throw new RuntimeException("傳入的引數不合法");

  }
}

// 測試
public void test2(){
    Goods[] arr = new Goods[4];
    arr[0] = new Goods("lx",123.12);
    arr[1] = new Goods("xm",23.12);
    arr[2] = new Goods("hw",67);
    arr[3] = new Goods("de",99);

    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));
//[Goods{name='xm',price=23.12},Goods{name='hw',price=67.0},Goods{name='de',price=99.0},Goods{name='lx',price=123.12}]

  }

2. Comparator 定製排序

當元素的型別沒有實現java.lang.Comparable介面而又不方便修改程式碼, 或者實現了java.lang.Comparable介面的排序規則不適合當前的操作,那 麼可以考慮使用 Comparator 的物件來排序

  • 重寫compare(Object o1,Object o2)方法,比較o1和o2的大小:如果方法返 回正整數,則表示o1大於o2;如果返回0,表示相等;返回負整數,表示 o1小於o2。
  • 可以將 Comparator 傳遞給 sort 方法(如 Collections.sort 或 Arrays.sort), 從而允許在排序順序上實現精確控制。
  • 還可以使用 Comparator 來控制某些資料結構(如有序 set或有序對映)的 順序,或者為那些沒有自然順序的物件 collection 提供排序。
// 這裡沒有使用泛型,String已經重寫了compareTo(obj)方法直接調
public void test3(){
    String[] arr = new String[]{"AA","CC"};
  // 這裡使用匿名
    Arrays.sort(arr,new Comparator() {

      // 安裝字串從大到小
      @Override
      public int compare(Object o1,Object 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));//[WW,AA]

  }

預設從小到大,可以直接再前面加符號就是從高到低

String、包裝類已經實現了compare()直接呼叫即可

public void test4(){
    Goods[] arr = new Goods[4];
    arr[0] = new Goods("lx",123.1);
    arr[1] = new Goods("lx",99);

    // 指明商品比較大小的方式,安裝產品的名稱從低到高排序,若名稱一樣,再安裝價格從高到底排序
    Arrays.sort(arr,new Comparator<Goods>() {
      @Override
      public int compare(Goods o1,Goods o2) {
        if (o1.getName().equals(o2.getName())){
          return -Double.compare(o1.getPrice(),o2.getPrice());
        }else{
          return o1.getName().compareTo(o2.getName());
        }
      }
    });
    System.out.println(Arrays.toString(arr));
  //[Goods{name='de',price=123.1},price=23.12}]
  }

Comparable介面與Comparator的使用的對比:

  • Comparable介面的方式一旦一定,保證Comparable介面實現類的物件在任何位置都可以比較大小。
  • Comparator介面屬於臨時性的比較。

以上就是詳解Java比較器的詳細內容,更多關於Java比較器的資料請關注我們其它相關文章!