【问题标题】:Divide array list into sub list of fixed size将数组列表划分为固定大小的子列表
【发布时间】:2014-12-25 09:13:39
【问题描述】:

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

如果我的列表大小是 100。我想在一个列表中有 30 个元素。所以基本上我想创建 4 个子列表。实现这一目标的最优化方法是什么...我在互联网上查看但大多数建议导致将数组列表分解为没有固定大小的 subsists。任何leads.pointers 高度赞赏。最好是,我希望有一个可以完成这项工作的服务/方法

【问题讨论】:

    标签: java arraylist logic


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
      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;
      }
      

      【讨论】:

        【解决方案3】:
        • 您可以使用List&lt;E&gt; subList(int fromIndex, int toIndex); 生成子列表。
        • 然后您可以将每个子列表转换为数组,使用&lt;T&gt; T[] toArray(T[] a);
        • 最后,Arrays.asList 将为您提供一个由该数组支持的固定大小的列表。

        【讨论】:

        • @laune OP 想要固定大小的子列表。 Arrays.asList 产生这样的列表。您需要一个数组才能使用 Arrays.asList。
        • Collection 的构造函数通过数组进行,所以这没有实际意义——我不想写已经写过的东西。即使没有,您也可以调用 trimToSize。 (而且它并不是真正固定,对吧?)
        • @laune 在您的代码中,您构建的 ArrayLists 的大小不是固定的。另一方面,如果您使用 Arrays.asList,您将获得一个真正固定的列表(它不返回 java.util.ArrayList,它返回具有固定长度的 java.util.Arrays.ArrayList。添加和不支持删除)
        【解决方案4】:

        我喜欢@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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-22
          • 2010-09-24
          • 1970-01-01
          • 2019-07-10
          • 2011-06-23
          • 2011-11-14
          • 2012-07-01
          相关资源
          最近更新 更多