java中分組統(tǒng)計(jì)的三種實(shí)現(xiàn)方式
平時(shí)工作中,很多時(shí)候都會(huì)用到對(duì)數(shù)據(jù)進(jìn)行分組操作,例如一個(gè)學(xué)生對(duì)象,有班級(jí)、名字、性別、分?jǐn)?shù)等,需要按班級(jí)分組統(tǒng)計(jì),該怎么操作呢?一個(gè)合理的算法可以提升不少效率。
大家看一下下面的案例:
//下面是初始化的數(shù)據(jù)
List<Student> list = new ArrayList<Student>();
Student student1 = new Student("李四1", "女", "一班");
Student student2 = new Student("李四2", "女", "一班");
Student student3 = new Student("李四3", "女", "一班");
Student student4 = new Student("李四4", "男", "一班");
Student student5 = new Student("李四5", "男", "一班");
Student student6 = new Student("李四6", "男", "二班");
Student student7 = new Student("李四7", "男", "二班");
Student student8 = new Student("李四8", "男", "二班");
Student student9 = new Student("李四9", "男", "二班");
list.add(student1);
list.add(student2);
list.add(student3);
list.add(student4);
list.add(student5);
list.add(student6);
list.add(student7);
list.add(student8);
list.add(student9);
1.合理利用map操作
在實(shí)際開發(fā)中合理的利用map自帶的方法,能解決很多問題
for (Student stu : list) {
if (!map.containsKey(stu.getProvinceCode())) {
ArrayList<ArrearageDeal> al = new ArrayList<ArrearageDeal>();
map.put(stu.getProvinceCode(), al.add(stu));
} else {
map.get(stu.getProvinceCode()).add(stu);
}
}
2.利用guava的Multimap
Multimap<String, Student> mulMap = ArrayListMultimap.create();
for (Student stu : list) {
mulMap.put(stu.getGrade,stu);
}
3.使用jdk8新特性–不要排斥新東西
畢竟java14都出來(lái)了,java8的新特性還是需要多了解
//一行就可以解決 Map<String, List<Student >> collect = list.stream().collect(Collectors.groupingBy(ArrearageDeal::getGrade));
上面三種當(dāng)時(shí)從代碼量上來(lái)看,java8的最簡(jiǎn)潔。但是實(shí)際開發(fā)中結(jié)合具體場(chǎng)景來(lái)說(shuō)2、3兩種都是不錯(cuò)的選擇。
Java8 多個(gè)字段分組統(tǒng)計(jì)
// 分組統(tǒng)計(jì)
Map<String, Long> countMap = records.stream().collect(Collectors.groupingBy(o -> o.getProductType() + "_" + o.getCountry(), Collectors.counting()));
List<Record> countRecords = countMap.keySet().stream().map(key -> {
String[] temp = key.split("_");
String productType = temp[0];
String country = temp[1];
Record record = new Record();
record.set("device_type", productType);
record.set("location", country;
record.set("count", countMap.get(key).intValue());
return record;
}).collect(Collectors.toList());
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring事務(wù)失效場(chǎng)景原理及解決方案
這篇文章主要介紹了Spring事務(wù)失效場(chǎng)景原理及解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
SpringBoot如何實(shí)現(xiàn)分離資源文件并打包
這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)分離資源文件并打包,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
python中jieba庫(kù)(中文分詞庫(kù))使用安裝教程
這篇文章主要介紹了python中jieba庫(kù)(中文分詞庫(kù))使用安裝教程,jieba庫(kù)是通過中文詞庫(kù)的方式來(lái)識(shí)別分詞的。它首先利用一個(gè)中文詞庫(kù),通過詞庫(kù)計(jì)算漢字之間構(gòu)成詞語(yǔ)的關(guān)聯(lián)概率,所以通過計(jì)算漢字之間的概率,就可以形成分詞的結(jié)果,需要的朋友可以參考下2023-04-04
idea運(yùn)行main方法或Test避免編譯整個(gè)應(yīng)用的實(shí)現(xiàn)方法
這篇文章主要介紹了idea運(yùn)行main方法或Test避免編譯整個(gè)應(yīng)用的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Java中redisTemplate注入失敗NullPointerException異常問題解決
這篇文章主要介紹了Java中redisTemplate注入失敗NullPointerException異常問題解決,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2023-08-08

