日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java comparator_Java 中如何指定集合元素的排序策略

發布時間:2025/3/19 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java comparator_Java 中如何指定集合元素的排序策略 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 前言

最近用到了集合排序(基于 Java 8)。現在我能用 Stream 的就用 Stream ,真香!排序可以這么寫:

List peoples = new ArrayList<>(); // 中間省略 // 按照年齡從小到大排序peoples.sort(Comparator.comparing(People::getAge));

這里排序用到了一個關鍵接口 java.util.Comparator。排序比較作為業務中經常出現的需求,我們有必要研究一下這個接口。

2. Comparator 概念

Comparator 是一個函數式接口。它經常用于沒有天然排序的集合進行排序,如 Collections.sort 或 Arrays.sort。或者對于某些有序數據結構的排序規則進行聲明,如 TreeSet 、TreeMap 。也就是該接口主要用來進行集合排序。

3. Comparator 中的方法

Comparator 作為一個函數式接口只有一個抽象方法,但是它有很多的默認方法,我們來認識一下這些方法們。

3.1 compare 抽象方法

作為Comparator 唯一的抽象方法,int compare(T o1,T o2) 比較兩個參數的大小, 返回負整數,零,正整數 ,分別代表 o1o2,通常分別返回 -1、0 或 1。偽表達式:

// 輸入兩個同類型的對象 ,輸出一個比較結果的int數字(x1,x2)-> int

實現該方法一定要注意以下事項:

  • 必須保證compare(x,y) 和compare(y,x) 的值的和必須為 0
  • 必須保證比較的順序關系是可傳遞的,如果compare(x,y)>0 而且compare(y,z)>0 則 compare(x,z)>0。
  • 如果存在 compare(x,y)=0,則對于 z 而言,存在 compare(x, z)==compare(y, z)。

然而并不 嚴格要求(compare(x, y)==0) == (x.equals(y))。一般說來,任何違背這個條件的 Comparator 實現都應該明確指出這一事實情況。

3.2 comparing 系列方法

Java 8 開始,Comparator 提供了一系列的靜態方法,并通過函數式的風格賦予 Comparator 更加強大和方便的功能,我們暫且稱它們為 comparing系列方法。

public static Comparator comparing( Function super T, ? extends U> keyExtractor, Comparator super U> keyComparator) { Objects.requireNonNull(keyExtractor); Objects.requireNonNull(keyComparator); return (Comparator & Serializable) (c1, c2) -> keyComparator.compare(keyExtractor.apply(c1), keyExtractor.apply(c2)); }

該方法是該系列方法的基本方法。是不是看上去很難懂的樣子?我們來分析一下該方法。它一共兩個參數都是函數式接口。

第一個參數 Function super T, ? extends U> keyExtractor 表示輸入一個是 T 類型對象,輸出一個 U 類型的對象,舉個例子,輸入一個 People 對象返回其年齡 Integer 數值:

// people -> people.getAge(); 轉換為下面方法引用Function getAge = People::getAge;

第二個參數 keyComparator就很好理解了,表示使用的比較規則。

對 c1,c2 按照 第一個參數 keyExtractor 提供的規則進行提取特征,然后第二個參數keyComparator對這兩個特征進行比較。下面的式子其實可以概括為 3.1 的 (x1,x2)-> int

(c1, c2) -> keyComparator.compare(keyExtractor.apply(c1), keyExtractor.apply(c2))

Comparator & Serializable 為 Java 8 新特性:同時滿足這兩個類型約束

理解了這個方法后,其它該系列的方法就好理解了,這里不再贅述。目前 comparing 系列方法使用更加廣泛。我們舉一些例子:

List peoples = new ArrayList<>();// ………………// 按照年齡從低到高排序peoples.sort(Comparator.comparing(People::getAge));// 按照年齡從高到低排序peoples.sort(Comparator.comparing(People::getAge, (x, y) -> -x.compareTo(y)));

同樣你可以使用 java.util.Collections 或者 Stream 提供的排序方法來使用Comparator。

4. 小結

今天對 Comparator進行了簡單的分析,它用于構建集合排序的規則,在日常開發中非常有用。下一篇 我們將對另一個和它十分相似的接口 Comparable 進行分析和比較它們的不同,敬請關注。

總結

以上是生活随笔為你收集整理的java comparator_Java 中如何指定集合元素的排序策略的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产乱淫av免费 | 在线爽 | 亚洲综合视频在线播放 | www狠狠| 一本之道高清无码视频 | 亚洲一区二区三区欧美 | 国产欧美日韩二区 | 最新黄色网址在线观看 | 久久天堂视频 | 欧美另类z0zx974 | 黄色在线视频播放 | 香蕉在线影院 | 蜜桃91精品入口 | 潮喷失禁大喷水aⅴ无码 | 肥臀浪妇太爽了快点再快点 | 国产精品久久久久久久久久久久午夜片 | 91精品小视频 | 伊人青青草原 | 噼里啪啦免费观看 | 天天操天天射天天爱 | 日韩成人av一区二区 | 国产精品一区二区在线观看 | 一区二区三区少妇 | 无码国产精品一区二区高潮 | 国产精品一级片在线观看 | 性农村xxxxx小树林 | 涩涩成人网 | 久草综合视频 | 国产精品扒开腿做爽爽爽男男 | 韩国午夜av | 中文字幕在线观看日本 | 熟睡侵犯の奶水授乳在线 | 亲子乱对白乱都乱了 | www.欧美在线观看 | 国产精品美女av | 哪个网站可以看毛片 | 麻豆社| 欧美日韩高清一区二区三区 | 水蜜桃av在线 | 喷潮在线 | 亚洲图片中文字幕 | 国产女厕一区二区三区在线视 | 欧美日韩一区二区三区四区 | 中国一及毛片 | 高清国产午夜精品久久久久久 | 奇米四色在线视频 | 99精品人妻少妇一区二区 | 国产日本一区二区三区 | 自拍偷拍三级 | 国产色视频| 成人一级片| 另类小说婷婷 | 欧美精品四区 | 欧美一级在线观看 | 人民的名义第二部 | 亚洲一区二区欧美 | 亚洲欧美天堂 | av美国| 成人在线观看免费爱爱 | 久久精品无码一区二区三区毛片 | 色播激情 | 米奇av | 日韩大胆视频 | 中文字幕一区二区三区在线播放 | 亚洲欧美在线免费观看 | xx性欧美肥妇精品久久久久久 | 亚洲欧美综合网 | 18岁成年人网站 | 久久人妻免费视频 | 黄色天天影视 | 成品短视频泡芙 | 亚洲综合图片区 | 久久嫩草 | 天堂国产一区二区三区 | 亚洲精品国产精品乱码不99按摩 | 性久久| 日韩精品免费一区二区夜夜嗨 | 日本久久不卡 | 欧美一级一级 | 毛片av在线| 美女被草视频 | 自拍偷拍国产 | 久射网 | 丝袜中文字幕 | 欧美资源站 | 日韩一区中文字幕 | www插插插 | 天堂在线观看 | 女人和拘做爰正片视频 | 久久成人在线 | 麻豆成人在线观看 | 91sao| 亚洲毛片精品 | 丰满人妻一区二区三区免费视频 | 探花国产在线 | 午夜激情视频 | 日韩av中文字幕在线免费观看 | 国产伦一区二区三区 | 欧美色哟哟 |