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

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

list.subList(a,b); 

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

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

这应该给你所有的部分:

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

通用function:

 public static  ArrayList chunks(ArrayList bigList,int n){ ArrayList chunks = new ArrayList(); 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; } 

享受吧〜:)

Java 8(不是它有优势):

  List list = new ArrayList<>(); Collections.addAll(list, "a","b","c","b","c","a","c","a","b"); 

分组大小:

  final int G = 3; final int NG = (list.size() + G - 1) / G; 

旧式:

  List> 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)); }); 

新风格:

  List> result = IntStream.range(0, NG) .mapToObj(i -> list.subList(3 * i, Math.min(3 * i + 3, list.size()))) .collect(Collectors.toList()); 

感谢@StuartMarks为忘记了toList。

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

伪代码:

 for (int n=0; n 

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

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

其中bigList实现List接口, 10是每个子列表的所需大小(最后一个可能更小)

 listSize = oldlist.size(); chunksize =1000; chunks = list.size()/chunksize; ArrayList subLists; ArrayList finalList; int count = -1; for(int i=0;i 

您可以使用此finalList,因为它包含oldList的chuncks列表。

我也在做关键:索引值的值映射。

  public static void partitionOfList(List l1, List l2, int partitionSize){ Map> mapListData = new LinkedHashMap>(); List partitions = new LinkedList(); for (int i = 0; i < l1.size(); i += partitionSize) { partitions.add(l1.subList(i,Math.min(i + partitionSize, l1.size()))); l2=new ArrayList(partitions); } int l2size = l2.size(); System.out.println("Partitioned List: "+l2); int j=1; for(int k=0;k) partitions.get(k); // System.out.println(l2.size()); if(l2.size()>=partitionSize && l2.size()!=1){ mapListData.put("val"+j+"-val"+(j+partitionSize-1), l2); j=j+partitionSize; } else if(l2.size()<=partitionSize && l2.size()!=1){ // System.out.println("::::@@::"+ l2.size()); int s = l2.size(); mapListData.put("val"+j+"-val"+(j+s-1), l2); //k++; j=j+partitionSize; } else if(l2.size()==1){ // System.out.println("::::::"+ l2.size()); //int s = l2.size(); mapListData.put("val"+j, l2); //k++; j=j+partitionSize; } } System.out.println("Map: " +mapListData); } public static void main(String[] args) { List l1 = new LinkedList(); l1.add(1); l1.add(2); l1.add(7); l1.add(4); l1.add(0); l1.add(77); l1.add(34); partitionOfList(l1,l2,2); } 

输出:

分区列表:[[1,2],[7,4],[0,77],[34]]

地图:{val1-val2 = [1,2],val3-val4 = [7,4],val5-val6 = [0,77],val7 = [34]}

通用方法为您提供帮助:

 private static List> createBatch(List originalList, int chunkSize) { List> listOfChunks = new ArrayList>(); for (int i = 0; i < originalList.size() / chunkSize; i++) { listOfChunks.add(originalList.subList(i * chunkSize, i * chunkSize + chunkSize)); } if (originalList.size() % chunkSize != 0) { listOfChunks.add(originalList.subList(originalList.size() - originalList.size() % chunkSize, originalList.size())); } return listOfChunks;