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

Java 将数组列表划分为固定大小的子列表,java,arraylist,logic,Java,Arraylist,Logic,我有一个数组列表,我想把它分解成固定大小的子列表- 如果我的列表大小是100。我想在一个列表中包含30个元素。因此,基本上我想创建4个子列表。实现这一点的最优化方法是什么…我在互联网上查看过,但大多数建议导致将数组列表拆分为没有固定大小的子列表。任何潜在客户。非常感谢指点。最好是,我希望有一个服务/方法来完成这项工作如果允许您使用第三方库,Guava将其作为单一方法提供,这是一个固定时间视图。如果允许您使用第三方库,Guava将其作为单一方法提供,这是一个固定时间视图。 您可以使用列表子列表(i

我有一个数组列表,我想把它分解成固定大小的子列表-


如果我的列表大小是100。我想在一个列表中包含30个元素。因此,基本上我想创建4个子列表。实现这一点的最优化方法是什么…我在互联网上查看过,但大多数建议导致将数组列表拆分为没有固定大小的子列表。任何潜在客户。非常感谢指点。最好是,我希望有一个服务/方法来完成这项工作

如果允许您使用第三方库,Guava将其作为单一方法提供,这是一个固定时间视图。

如果允许您使用第三方库,Guava将其作为单一方法提供,这是一个固定时间视图。

  • 您可以使用
    列表子列表(int-fromIndex,int-toIndex)生成子列表。
  • 然后您可以使用
    T[]toArray(T[]a)将每个子列表转换为一个数组
  • 最后,
    Arrays.asList
    将为您提供一个由该数组支持的固定大小的列表
      • 您可以使用
        列表子列表(int-fromIndex,int-toIndex)生成子列表。
      • 然后您可以使用
        T[]toArray(T[]a)将每个子列表转换为一个数组
      • 最后,
        Arrays.asList
        将为您提供一个由该数组支持的固定大小的列表
      公共静态列表拆分(列表列表列表,整数列){
      List listOfLists=新建ArrayList();
      inthi=0;
      对于(int-lo=0;loalist.size())hi=alist.size();
      添加(新的数组列表(列表子列表(lo,hi));
      }
      返回列表;
      }
      
      公共静态列表拆分(列表列表列表,整数列){
      List listOfLists=新建ArrayList();
      inthi=0;
      对于(int-lo=0;loalist.size())hi=alist.size();
      添加(新的数组列表(列表子列表(lo,hi));
      }
      返回列表;
      }
      
      我喜欢@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
      }
      
      publicstaticlist-splitJava8(列表列表,最终整数){
      return IntStream.range(0,alist.size())//迭代整个过程
      .filter(i->i%len==0)//过滤掉每个“len”数字
      .boxed()//创建流(而不是IntStream)
      .map(i->alist.subList(i,Math.min(i+len,alist.size()))//创建子列表
      .collect(Collectors.toList());//将整个内容收集到列表中
      }
      
      我喜欢@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
      }
      
      publicstaticlist-splitJava8(列表列表,最终整数){
      return IntStream.range(0,alist.size())//迭代整个过程
      .filter(i->i%len==0)//过滤掉每个“len”数字
      .boxed()//创建流(而不是IntStream)
      .map(i->alist.subList(i,Math.min(i+len,alist.size()))//创建子列表
      .collect(Collectors.toList());//将整个内容收集到列表中
      }
      
      @laune OP需要固定大小的子列表。Arrays.asList生成这样的列表。要使用Arrays.asList,您需要一个数组。集合中的构造函数是通过数组进行的,所以这是没有意义的-我不希望编写已经编写的内容。即使没有,你也可以称之为trimToSize。(这并不是真的固定的,对吧?@laune在你的代码中,你构建的ArrayList的大小不是固定的。另一方面,如果您使用Arrays.asList,您将得到一个真正固定的列表(它不返回java.util.ArrayList,而是返回具有固定长度的java.util.Arrays.ArrayList。不支持添加和删除)@laune OP想要固定大小的子列表。Arrays.asList生成这样的列表。要使用Arrays.asList,您需要一个数组。集合中的构造函数是通过数组进行的,所以这是没有意义的-我不希望编写已经编写的内容。即使没有,你也可以称之为trimToSize。(这并不是真的固定的,对吧?@laune在你的代码中,你构建的ArrayList的大小不是固定的。另一方面,如果使用Arrays.asList,则会得到一个真正固定的列表(它不返回java.util.ArrayList,而是返回具有固定长度的java.util.Arrays.ArrayList。不支持添加和删除)