如何按列表元素数量对Collection<List<Person>>降序排序?
按分组列表元素数量降序排序的实现
你可以通过以下两种方式实现需求,让元素数量最多的部门列表排在首位:
方式一:对已有的Collection进行排序
原代码得到的Collection<List<Person>>本身不支持排序操作,需要先转换为有序的List(比如ArrayList),再通过自定义Comparator完成降序排序:
// 将无序的Collection转为ArrayList List<List<Person>> sortedList = new ArrayList<>(personsByDepartment); // 按列表元素数量从多到少排序 sortedList.sort(Comparator.comparingInt(List::size).reversed());
如果习惯用匿名内部类的写法,也可以这样写:
sortedList.sort((listA, listB) -> Integer.compare(listB.size(), listA.size()));
方式二:在流式处理阶段直接完成分组+排序
可以将分组、取values、排序、收集为List的步骤合并到一个流操作中,一步到位:
List<List<Person>> sortedPersonsByDepartment = persons.stream() .collect(Collectors.groupingBy(Person::getDepartment)) // 按部门分组 .values() // 获取所有部门对应的人员列表 .stream() // 转为流进行排序 .sorted(Comparator.comparingInt(List::size).reversed()) // 按列表大小降序 .collect(Collectors.toList()); // 收集为有序List
说明
默认情况下Collectors.groupingBy返回的是HashMap,其values()方法返回的Collection是无序的,因此必须转为有序集合(比如List)后再执行排序逻辑。排序时通过Comparator.comparingInt(List::size).reversed()实现按列表元素数量的降序排列,确保元素多的列表排在最前面。
内容的提问来源于stack exchange,提问作者java12399900
相关产品推荐
相关产品推荐

