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)
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)
享受吧〜:)
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.
如果您受到 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)
如果您已经拥有或不介意添加 Guava 库,则无需重新发明轮子。
简单地做: final List<List<String>> splittedList = Lists.partition(bigList, 10);
wherebigList实现List接口并且10是每个子列表的所需大小(最后一个可能更小)