将数组列表划分为固定大小的子列表

时间:2014-12-25 09:13:40

标签: java arraylist logic

我有一个数组列表。我想将其分解为固定大小的子列表。例如 -

如果我的列表大小是100.我想在一个列表中有30个元素。所以基本上我想创建4个子列表。什么是实现这个的最优化的方法...我看了互联网,但大多数建议导致将阵列列表分成不存在固定大小的存在。任何线索。指针高度赞赏。最好的,我希望有一个服务/方法来完成这项工作

4 个答案:

答案 0 :(得分:2)

如果允许您使用第三方库,Guava会将此作为单一方法Lists.partition提供,这是一个恒定的时间视图。

答案 1 :(得分:1)

public static <T> List<List<T>> split( List<T> alist, int len ){
  List<List<T>> listOfLists = new ArrayList<>();
  int hi = 0;
  for( int lo = 0; lo < alist.size(); lo = hi ){
    hi = lo + len;
    if( hi > alist.size() ) hi = alist.size();
    listOfLists.add( new ArrayList<T>( alist.subList( lo, hi ) ) );
  }
  return listOfLists;
}

答案 2 :(得分:0)

  • 您可以使用List<E> subList(int fromIndex, int toIndex);生成子列表。
  • 然后,您可以使用<T> T[] toArray(T[] a);
  • 将每个子列表转换为数组
  • 最后Arrays.asList将为您提供由该数组支持的固定大小的列表。

答案 3 :(得分:0)

我喜欢@laune的答案但是如果你使用Java 8,那么也可以使用功能样式方法来避免外部循环。

public static <T> List<List<T>> splitJava8(List<T> alist, final int len) {
    return IntStream.range(0, alist.size()) // Iterate over the whole thing
            .filter(i -> i % len == 0) // Filter out every 'len' number
            .boxed() // Create a stream (instead of IntStream)
            .map(i -> alist.subList(i, Math.min(i + len, alist.size()))) // create sublists
            .collect(Collectors.toList()); // Collect the whole thing to a list of lists
}