【问题标题】:Large ArrayList break down into batches [duplicate]大型ArrayList分解成批次[重复]
【发布时间】:2020-02-16 16:05:45
【问题描述】:

我有一个大小为 30K 的列表,我将它们分成 1000 个块,因为我需要使用子列表中的 id 来获取休息端点并做一些断言。我正在使用 jersey 客户端与其他端点通信

ArrayList<String> ga1 = new ArrayList<>(Ids.subList(1,1000));
ArrayList<String> ga2 = new ArrayList<>(Ids.subList(1001,2000));
ArrayList<String> ga3 = new ArrayList<>(Ids.subList(2001,3000));
ArrayList<String> ga4 = new ArrayList<>(Ids.subList(3001,4000));
...
ArrayList<String> ga30 = new ArrayList<>(Ids.subList(29001,sizeOfTheOriginalList));

checkSubList(ga1);
{
    Assertions;
}

checkSubList(ga30);
{
    Assertions;
}

有没有更好的方法来拆分原始列表并获取子列表

【问题讨论】:

  • 使用循环?还有一个 List>?避免忽略第一个元素或每个块。
  • 仅供参考: Java 索引是从零开始的上排的,所以你跳过了第一个值每个块的。更改为subList(0,1000)subList(1000,2000)subList(2000,3000)、...
  • ...使用子列表时

标签: java list java-8


【解决方案1】:

这个原则叫做“不要重复自己”。您的代码行有很多重复(对于ga1ga2,等等。

其他提示: - 不要将变量声明为ArrayList,将其声明为您关心的接口List。 - 根据 Java 标准,变量 Ids 应该是 ids。 - 您可以使用subList,而无需从中构造新的ArrayList

这段代码表明了这一点。

import java.util.*;
import java.util.stream.*;

public class A {
    public static void main(String[] args) {
        int upperLimit = 30000;
        // Create ids in next line just to illustrate  a list of 30000 items
        List<String> ids = IntStream.range(0, upperLimit).mapToObj(x -> "" + x).collect(Collectors.toList());

        int step = 1000;
        for (int i = 0; i < upperLimit; i += step) {
            List<String> ga = ids.subList(i, i + step);
            checkSubList(ga);
        }
    }

    private static void checkSubList(List<String> ga) {
        //  implement this as you'd like
        System.out.println(ga);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多