gpt4 book ai didi

Java : Creating chunks of List for processing

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:39:55 25 4
gpt4 key购买 nike

我有一个包含大量元素的列表。在处理这个列表时,在某些情况下我希望将列表分成更小的子列表,而在某些情况下我想处理整个列表。

private void processList(List<X> entireList, int partitionSize)
{
Iterator<X> entireListIterator = entireList.iterator();
Iterator<List<X>> chunkOfEntireList = Iterators.partition(entireListIterator, partitionSize);
while (chunkOfEntireList.hasNext()) {
doSomething(chunkOfEntireList.next());
if (chunkOfEntireList.hasNext()) {
doSomethingOnlyIfTheresMore();
}
}

我正在使用 com.google.common.collect.Iterators 来创建分区。文档链接 here因此,如果我想将列表分区为 100,我会调用

processList(entireList, 100);

现在,当我不想创建列表 block 时,我想我可以将 Integer.MAX_VALUE 作为 partitionSize 传递。

processList(entireList, Integer.MAX_VALUE);

但这会导致我的代码内存不足。有人可以帮我吗?我错过了什么?迭代器在内部做什么,我该如何克服这个问题?

编辑:我还要求内部的“if”子句仅在有更多列表要处理时才执行某些操作。即我需要迭代器的 hasNext() 函数。

最佳答案

您会遇到内存不足错误,因为 Iterators.partition() 在内部填充具有给定分区长度的数组。分配的数组始终是分区大小,因为在迭代完成之前不知道元素的实际数量。 (如果他们在内部使用了 ArrayList,这个问题就可以避免;我猜想设计者认为数组在一般情况下会提供更好的性能。)

使用 Lists.partition() 将避免这个问题,因为它委托(delegate)给 List.subList(),它只是一个 View 基础列表:

private void processList(List<X> entireList, int partitionSize) {
for (List<X> chunk : Lists.partition(entireList, partitionSize)) {
doSomething(chunk);
}
}

关于Java : Creating chunks of List for processing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43314919/

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