1.代码

package com.xtm.java.test;import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;/*** 分组实现*/
public class Test{//实体类class Apple {String color;int weight;Apple(String color, int weight) {super();this.color = color;this.weight = weight;}@Overridepublic String toString() {return "Apple{" +"颜'" + color + '\'' +", 重:" + weight +'}';}}public static void main(String args[]){List<Apple> list = new ArrayList<>();list.add(new Test().new Apple("红", 205));list.add(new Test().new Apple("绿", 248));list.add(new Test().new Apple("红", 131));list.add(new Test().new Apple("黄", 119));list.add(new Test().new Apple("绿", 153));list.add(new Test().new Apple("黄", 224));//按颜色分组List<List<Apple>> byColorList = byColorGroupApple(list, Comparator.comparing(t -> t.color));printList(byColorList);//按重量级分组List<List<Apple>> byWeightList = byColorGroupApple(list, (t1, t2) -> t1.weight/100==t2.weight/100?0:1);printList(byWeightList);}private static void printList(List<List<Apple>> byColorList) {System.out.println("分组后:"+byColorList);}/*** 根据传入的比较器进行集合的分组* @param data 需要分组的元素集合* @param c 传入的比较器* @param <T> 元素* @return 返回分组后的集合列表*/private static <T> List<List<T>> byColorGroupApple(Collection<T> data, Comparator<? super T> c) {//方法上使用泛型 记得在返回值前加<T>List<List<T>> result = new ArrayList<>();for (T t : data) {//1.循环取出集合中的每个元素boolean isSameGroup = false;//2.标志为不是同组for (List<T> aResult : result) {//4.循环查找当前元素是否属于某个已创建的组if (c.compare(t, aResult.get(0)) == 0) {//aResult.get(0)表示:只要当前元素和某个组的第一个元素通过比较器比较相等则属于该组isSameGroup = true;//5.查询到当前元素属于某个组则设置标志位,不让其创键新组aResult.add(t);//6.把当前元素添加到当前组break;}}if (!isSameGroup) {//3.不属于任何组的则创建一个新组,并把元素添加到该组// 创建List<T> innerList = new ArrayList();innerList.add(t);result.add(innerList);}}return result;}}

代码2:java8

package com.xtm.java.test;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;import static java.util.stream.Collectors.groupingBy;public class Student {private int id;private String sex;private String name;public static void main(String[] args) {List<Student> list = new ArrayList();list.add(new Student(1,"男","zhangsan"));list.add(new Student(2,"女","lisi"));list.add(new Student(3,"男","wangsu"));list.add(new Student(2,"女","zhaoliu"));list.add(new Student(1,"男","zhuoqi"));list.add(new Student(3,"女","cangkong"));//将所有的学生按照性别进行分组Map<String, List<Student>> collect = list.stream().collect(Collectors.groupingBy(Student::getSex));//用方法引用可读性更好Map<String, List<Student>> collect2 = list.stream().collect(groupingBy(Student::getSex));//按照Id分组Map<Integer, List<Student>> collect3 = list.stream().collect(groupingBy(Student::getId));//自定义函数分组Map<Integer, List<Student>> collect4 = list.stream().collect(groupingBy(stu -> stu.hashCode() % 5));System.out.println(collect);System.out.println(collect2);System.out.println(collect3);System.out.println(collect4);}public Student(int id, String sex, String name) {this.id = id;this.sex = sex;this.name = name;}public int getId() {return id;}public String getSex() {return sex;}public String getName() {return name;}@Overridepublic String toString() {return "Student{" +"id=" + id +", sex='" + sex + '\'' +", name='" + name + '\'' +'}';}
}

2.运行结果

分组后:[[Apple{颜'红', 重:205}, Apple{颜'红', 重:131}], [Apple{颜'绿', 重:248}, Apple{颜'绿', 重:153}], [Apple{颜'黄', 重:119}, Apple{颜'黄', 重:224}]]
分组后:[[Apple{颜'红', 重:205}, Apple{颜'绿', 重:248}, Apple{颜'黄', 重:224}], [Apple{颜'红', 重:131}, Apple{颜'黄', 重:119}, Apple{颜'绿', 重:153}]]
{女=[Student{id=2, sex='女', name='lisi'}, Student{id=2, sex='女', name='zhaoliu'}], 男=[Student{id=1, sex='男', name='zhangsan'}, Student{id=3, sex='男', name='wangsu'}, Student{id=1, sex='男', name='zhuoqi'}, Student{id=3, sex='男', name='cangkong'}]}
{女=[Student{id=2, sex='女', name='lisi'}, Student{id=2, sex='女', name='zhaoliu'}], 男=[Student{id=1, sex='男', name='zhangsan'}, Student{id=3, sex='男', name='wangsu'}, Student{id=1, sex='男', name='zhuoqi'}, Student{id=3, sex='男', name='cangkong'}]}
{1=[Student{id=1, sex='男', name='zhangsan'}, Student{id=1, sex='男', name='zhuoqi'}], 2=[Student{id=2, sex='女', name='lisi'}, Student{id=2, sex='女', name='zhaoliu'}], 3=[Student{id=3, sex='男', name='wangsu'}, Student{id=3, sex='男', name='cangkong'}]}
{0=[Student{id=2, sex='女', name='lisi'}, Student{id=2, sex='女', name='zhaoliu'}], 1=[Student{id=3, sex='男', name='wangsu'}], 2=[Student{id=1, sex='男', name='zhangsan'}, Student{id=1, sex='男', name='zhuoqi'}], 4=[Student{id=3, sex='男', name='cangkong'}]}

3.原文连接

https://blog.csdn.net/dalinsi/article/details/78067576

https://blog.csdn.net/u012250875/article/details/55126531

java 实现集合分组功能相关推荐

  1. java 8 集合分组_Java 8:按集合分组

    java 8 集合分组 在继续阅读Venkat Subramaniam的" Java函数式编程 "时,我到达了介绍Stream#collect函数的那部分. 我们想收集一个人,按年 ...

  2. Java list集合 分组并排序

    一.list 分组有序 TreeMap<Integer, List<StudenData>> listTreeMap = studentList.parallelStream( ...

  3. java集合的功能_功能性Java集合

    java集合的功能 如今,在功能上大肆宣传,因此至少在Java集合方面,我会简要概述一下. 我个人喜欢标准 集合API,但在某些情况下可能会很尴尬并添加其他详细信息. 在Java 8+的更高版本中,这 ...

  4. Java 8:按集合分组

    在继续阅读Venkat Subramaniam的" Java函数式编程 "时,我到达了介绍Stream#collect函数的那部分. 我们想收集一个人,按年龄分组,并返回一张方便的 ...

  5. Java SE 8新功能介绍:使用Streams API处理集合

    使用Java SE 8 Streams的代码更干净,易读且功能强大..... 在" Java SE 8新功能介绍"系列的这篇文章中,我们将深入解释和探索代码,以了解如何使用流遍历集 ...

  6. Java SE 8新功能介绍:Lambda的遍历,过滤,处理集合和方法增强

    在" Java SE 8新功能导览"系列的这篇文章中,我们将深入解释并探索代码,以了解如何使用lambda表达式和方法引用 遍历集合 ,并使用谓词接口过滤它们,实现默认方法在接口中 ...

  7. postgresql 集合类型_PostgreSQL 分组集合新功能(GROUPING SETS,CUBE,ROLLUP)

    PostgreSQL 分组集合新功能(GROUPING SETS,CUBE,ROLLUP) 实验环境 操作系统:windows 10 家庭中文版 数据库系统: PostgreSQL 9.6.2 说明 ...

  8. JAVA基础---集合(一)--集合框架概述

    为什么用集合如何合理用集合,以及如何实现的和他们的实现原理,如果搞清了对于之后学习其他知识和开发是很有大帮助性的. 什么是集合框架? 集合框架是表示和操作集合的统一体系结构.所有集合框架都包含以下内容 ...

  9. java的集合:List、Set和Map

    虚线是接口,实线是实现类: 集合能够解决的问题:集合可以丽杰为是一种更高级的数组,可以保存多条数据 本质:java官方开发人员基于java的一些基础内容(数组等等)创建了一些接口和类,然后使用这些接口 ...

最新文章

  1. 两年的等待,近700页干货,同系列累计销量25万+,第三版内容更扎实
  2. 学习python时报SyntaxError: Non-ASCII character '\xe5' in file解决方法
  3. 域名解析对网站SEO优化有何影响?
  4. ZOJ 3829 贪心 思维题
  5. NeHe OpenGL教程 第二十一课:线的游戏
  6. 黑白树(牛客网+树形dp)
  7. C#对config配置文件的管理
  8. Redis 有哪些数据类型?
  9. JAVA获得天气json数据的方法,获取从天气预报接口返回回来的json数据
  10. 你的简历已经被机器人筛选了
  11. HDU - 1863-畅通工程(最小生成树)
  12. Netty工作笔记0015---MappedByteBuffer使用
  13. pandas将某列复制到另一个表_使用pandas将列从一个数据帧复制到另一个数据帧的最快方法?...
  14. Mysql的可视化工具整理
  15. 自媒体文案伪原创文章生成器软件
  16. android开发从入门到精通 扶松柏 PDF版
  17. DLink无线路由器做交换机配置
  18. c语言中shift f12组合建,C++学习1-(C语言基础、VS快捷键)
  19. 10款堪称神器的免费电脑软件推荐
  20. 用c#二次开发的焊锡检测视觉系统

热门文章

  1. 爬取豆瓣TOP250-避免反爬虫(2021-10-09)
  2. 避免自动化远程连接服务器出现提示Are you sure you want to continue connecting (yes/no/[fingerprint])?
  3. malloc实现原理探究
  4. VC操作Excel收集
  5. 中式快餐上市潮来袭?老乡鸡、老娘舅启动辅导,前者刚被通报责令改正
  6. 从App Store的评分,再看钉钉、企微和飞书的不同
  7. What Types of Movies Do You like ?
  8. linux系统有哪些电脑,常见的Linux操作系统有哪些 常见的Linux操作系统介绍
  9. Web前端从入门到精通自学之路
  10. 华为LAB实验室-1.线性回归