如何将数组列表拆分成相等的部分?

Pra*_*mha 24 java plsql oracle10g

无论如何将ArrayList拆分成不同的部分而不知道它的大小直到运行时?我知道有一种叫做的方法:

list.subList(a,b);
Run Code Online (Sandbox Code Playgroud)

但我们需要明确提到盯着和结束范围的清单.我的问题是,我们得到一个包含帐号的arraylist,其中包含2000,4000个帐号的数据(编码时间内不会知道数字),我需要将此符号传递给PL/SQL的IN查询,如IN不支持超过1000个值,我试图分成多个块并将其发送到查询

注意:我不能使用像番石榴等任何外部库.. :(在这方面的任何指南表示赞赏.

Sub*_*odh 66

这应该给你所有的部分:

int partitionSize = 1000;
List<List<Integer>> partitions = new LinkedList<List<Integer>>();
for (int i = 0; i < originalList.size(); i += partitionSize) {
    partitions.add(originalList.subList(i,
            Math.min(i + partitionSize, originalList.size())));
}
Run Code Online (Sandbox Code Playgroud)

  • 不应该是`Math.min(i + partitionSize,originalList.size() - i)`? (2认同)
  • 我认为它应该是```Math.min(i + partitionSize,originalList.size())``` (2认同)

Hen*_*ang 13

通用功能:

public static <T> ArrayList<T[]> chunks(ArrayList<T> bigList,int n){
    ArrayList<T[]> chunks = new ArrayList<T[]>();

    for (int i = 0; i < bigList.size(); i += n) {
        T[] chunk = (T[])bigList.subList(i, Math.min(bigList.size(), i + n)).toArray();         
        chunks.add(chunk);
    }

    return chunks;
}
Run Code Online (Sandbox Code Playgroud)

享受吧〜:)


Joo*_*gen 7

Java 8(不是它有优势):

    List<String> list = new ArrayList<>();
    Collections.addAll(list,  "a","b","c","b","c","a","c","a","b");
Run Code Online (Sandbox Code Playgroud)

分组大小:

    final int G = 3;
    final int NG = (list.size() + G - 1) / G;
Run Code Online (Sandbox Code Playgroud)

旧式:

    List<List<String>> result = new ArrayList(NG);
    IntStream.range(0, list.size())
        .forEach(i -> {
            if (i % G == 0) {
                result.add(i/G, new ArrayList<>());
            }
            result.get(i/G).add(list.get(i));
        });
Run Code Online (Sandbox Code Playgroud)

新风格:

    List<List<String>> result = IntStream.range(0, NG)
        .mapToObj(i -> list.subList(3 * i, Math.min(3 * i + 3, list.size())))
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

感谢@StuartMarks为忘记了toList.


Jim*_*son 6

如果您受到 PL/SQLin限制的约束,那么您想知道如何将列表拆分为大小为<=n 的块,其中n是限制。这是一个简单得多的问题,因为它不需要事先知道列表的大小。

伪代码:

for (int n=0; n<list.size(); n+=limit)
{
    chunkSize = min(list.size,n+limit);
    chunk     = list.sublist(n,chunkSize);
    // do something with chunk
}
Run Code Online (Sandbox Code Playgroud)


daz*_*ito 5

如果您已经拥有或不介意添加 Guava 库,则无需重新发明轮子。

简单地做: final List<List<String>> splittedList = Lists.partition(bigList, 10);

wherebigList实现List接口并且10是每个子列表的所需大小(最后一个可能更小)