栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用Java8流对TreeSet列表进行排序

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用Java8流对TreeSet列表进行排序

@Eugene的回答很甜蜜,因为番石榴很甜。但是,如果您碰巧在类路径中没有番石榴,这是另一种方式:

List<Set<Integer>> list = block.stream()    .flatMap(Set::stream)    .sorted()    .collect(partitioning(3));

首先,我将所有集合映射到一个流中,然后对所有元素进行排序,最后,将整个排序后的流收集到集合列表中。为此,我正在调用使用自定义收集器的辅助方法:

private static <T> Collector<T, ?, List<Set<T>>> partitioning(int size) {    class Acc {        int count = 0;        List<Set<T>> list = new ArrayList<>();        void add(T elem) { int index = count++ / size; if (index == list.size()) list.add(new linkedHashSet<>()); list.get(index).add(elem);        }        Acc merge(Acc another) { another.list.stream().flatMap(Set::stream).forEach(this::add); return this;        }    }    return Collector.of(Acc::new, Acc::add, Acc::merge, acc -> acc.list);}

该方法接收每个分区的大小,并使用

Acc
本地类作为收集器要使用的可变结构。在
Acc
类内部,我正在使用一个
List
包含
linkedHashSet
实例的实例,该实例将保存流的元素。

Acc
类保存所有已已收集到的元素的个数。在该
add
方法中,我计算列表的索引并递增此计数,如果列表的该位置没有设置,则将新的空值附加
linkedHashSet
到该位置。然后,将元素添加到集合中。

在调用

sorted()
流对元素进行收集之前对其进行排序时,我需要使用保留插入顺序的数据结构。这就是为什么我要使用
ArrayList
外部列表和
linkedHashSet
内部集合。

merge
方法将由并行流使用,以合并两个先前累积的
Acc
实例。我只是通过委托给方法,将接收到的
Acc
实例的所有元素添加到该
Acc
实例中
add

最后,我正在使用

Collector.of
基于
Acc
类方法的收集器。最后一个参数是装订器功能,它仅返回
Acc
实例的列表。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/428572.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号