Java Guava排序器Ordering原理及代碼實(shí)例
一 創(chuàng)建排序器
排序器:可以用來為構(gòu)建復(fù)雜的比較器,以完成集合排序的功能:
本質(zhì)上來說,Ordering 實(shí)例無非就是一個(gè)特殊的Comparator 實(shí)例。
Ordering把很多基于Comparator的靜態(tài)方法(如Collections.max)包裝為自己的實(shí)例方法(非靜態(tài)方法),
并且提供了鏈?zhǔn)秸{(diào)用方法,來定制和增強(qiáng)現(xiàn)有的比較器
//創(chuàng)建排序器
@Test
public void createOreing(){
//對(duì)可排序類型做自然排序,如數(shù)字按大小,日期按先后排序
Ordering<Comparable> natural = Ordering.natural();
//按對(duì)象的字符串形式做字典排序
Ordering.usingToString();
//把給定的Comparator轉(zhuǎn)化為排序器或者繼承Ordering實(shí)現(xiàn)自定義排序器
Ordering<Integer> from = Ordering.from((Integer x, Integer y) -> Ints.compare(x, y));
System.out.println(from.max(5, 6));
}
二 擴(kuò)展排序器,變換成其他功能排序器
//衍生其他排序器
@Test
public void anotherOreing(){
Ordering<Comparable> natural = Ordering.natural();
natural.max(1, 2); //2
//獲取語義相反的排序器
natural.reverse().max(1, 2); //1
List<Integer> list = Lists.newArrayList(5, 9, 3, 7, 4);
Collections.sort(list,natural.nullsFirst()); //使用排序器對(duì)集合排序
list.forEach(x-> System.out.print(x+", ")); //3, 4, 5, 7, 9
// 不使用這兩個(gè)排序器,排序元素不能為null,否則會(huì)報(bào)空指針
natural.nullsFirst();//使用當(dāng)前排序器,并把null值排到最前
natural.nullsLast();//使用當(dāng)前排序器,并把null值排到最后
natural.compound(natural);//合成另一個(gè)比較器,以處理當(dāng)前排序器中的相等情況,即添加第二個(gè)比較器
//onResultOf:將function應(yīng)用在各個(gè)元素上之后, 在使用原始o(jì)rdering進(jìn)行排序
Collections.sort(list,natural.onResultOf(x->x*(-1)));//元素變?yōu)樨?fù)數(shù)再排序
list.forEach(x-> System.out.print(x+", ")); //9, 7, 5, 4, 3
}
三 使用排序器
//使用排序器
@Test
public void operOrdering(){
Ordering<Comparable> natural = Ordering.natural();
List<Integer> list02 = Lists.newArrayList(6,4,9,3,1,5,3);
/**
* greatestOf: 獲取可迭代對(duì)象中最大的k個(gè)元素,并按從大到小排序,返回一個(gè)集合
* leastOfL獲取最小的幾個(gè),并按從小到大排序
*/
natural.greatestOf(list02,1).forEach(x-> System.out.println(x)); //9
natural.leastOf(list02,1).forEach(x-> System.out.println(x)); //1
//返回集合的一個(gè)排好序的副本
natural.sortedCopy(list02);
natural.immutableSortedCopy(list02); //返回不可變的排序副本
/**
* isOrdered: 判斷是否已經(jīng)按排序器有序,元素不能少于2,允許有相等元素
* isStrictlyOrdered: 是否嚴(yán)格排序,不允許有相等元素
*/
Collections.sort(list02,natural);
natural.isOrdered(list02);//true
natural.isStrictlyOrdered(list02); //false
//其他直接比較元素
natural.compare(1,2);natural.max(5,6);natural.min(list02);
}
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaWeb Servlet實(shí)現(xiàn)網(wǎng)頁登錄功能
這篇文章主要為大家詳細(xì)介紹了JavaWeb Servlet實(shí)現(xiàn)網(wǎng)頁登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Java人機(jī)猜拳實(shí)現(xiàn)的思路及方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Java人機(jī)猜拳實(shí)現(xiàn)的思路及方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Java中redisTemplate注入失敗NullPointerException異常問題解決
這篇文章主要介紹了Java中redisTemplate注入失敗NullPointerException異常問題解決,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2023-08-08
Spring Security OAuth 自定義授權(quán)方式實(shí)現(xiàn)手機(jī)驗(yàn)證碼
這篇文章主要介紹了Spring Security OAuth 自定義授權(quán)方式實(shí)現(xiàn)手機(jī)驗(yàn)證碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02

