詳解Java比較器
阿新 • • 發佈:2020-07-17
正文
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比較器的資料請關注我們其它相關文章!