gpt4 book ai didi

Java 8 分区列表

转载 作者:太空狗 更新时间:2023-10-29 22:34:00 26 4
gpt4 key购买 nike

是否可以将纯 Jdk8 中的列表划分为相等的 block (子列表)。

我知道可以使用 Guava Lists类,但是我们可以用纯 Jdk 来做吗?我不想向我的项目添加新的 jar,只是为了一个用例。

解决方案:

迄今为止最好的解决方案由 tagir-valeev 提出:

我还找到了three other possibilities ,但它们仅适用于少数情况:

1.Collectors.partitioningBy() 将列表拆分为 2 个子列表——如下所示:

intList.stream().collect(Collectors.partitioningBy(s -> s > 6));
List<List<Integer>> subSets = new ArrayList<List<Integer>>(groups.values());

2.Collectors.groupingBy() 将我们的列表拆分为多个分区:

 Map<Integer, List<Integer>> groups = 
intList.stream().collect(Collectors.groupingBy(s -> (s - 1) / 3));
List<List<Integer>> subSets = new ArrayList<List<Integer>>(groups.values());

3.按分隔符拆分:

List<Integer> intList = Lists.newArrayList(1, 2, 3, 0, 4, 5, 6, 0, 7, 8);

int[] indexes =
Stream.of(IntStream.of(-1), IntStream.range(0, intList.size())
.filter(i -> intList.get(i) == 0), IntStream.of(intList.size()))
.flatMapToInt(s -> s).toArray();
List<List<Integer>> subSets =
IntStream.range(0, indexes.length - 1)
.mapToObj(i -> intList.subList(indexes[i] + 1, indexes[i + 1]))
.collect(Collectors.toList());

4.使用流+计数器source :

final List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7);
final int chunkSize = 3;
final AtomicInteger counter = new AtomicInteger();

final Collection<List<Integer>> result = numbers.stream()
.collect(Collectors.groupingBy(it -> counter.getAndIncrement() / chunkSize))
.values();

最佳答案

这可以使用 subList() 方法轻松完成:

List<String> collection = new ArrayList<>(21);
// fill collection
int chunkSize = 10;
List<List<String>> lists = new ArrayList<>();
for (int i = 0; i < collection.size(); i += chunkSize) {
int end = Math.min(collection.size(), i + chunkSize);
lists.add(collection.subList(i, end));
}

关于Java 8 分区列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30995763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com