【问题标题】:Retrieving a certain number of items from a java list for processing从 java 列表中检索一定数量的项目以进行处理
【发布时间】:2012-03-13 05:35:13
【问题描述】:

我有一种情况,我们将 List 传递给一个方法进行处理。我们现在需要确保在任何给定时间只传递一个包含 40 个项目的列表。换句话说,如果列表有 100 项,那么它应该通过传递 40 项的列表来调用该方法,然后再传递 40 项,然后是最后 20 项。我怎样才能实现这种行为?一些例子会很有帮助。

【问题讨论】:

  • 您能解释一下为什么您有 40 件商品的限制吗?这对于避免在解决方案中重现相同的问题非常有帮助
  • 感谢所有帮助。限制来自我们正在调用的另一个服务,并且该服务方法一次只能处理 40 个,如果超过 40 个,则会在响应中返回错误。所以在我们的代码中,当客户端请求对象包含这个包含超过 40 个项目的列表时,如果需要,我需要能够通过传递子列表来分解它并多次调用该事务方法,然后跟踪每个响应。

标签: java


【解决方案1】:

在调用方法之前,请测试列表的大小。如果它高于 40,您可以启动一个循环,该循环将创建一个包含 40 个项目(最大值)的新列表,并将该列表作为您的方法调用参数传递。

【讨论】:

    【解决方案2】:

    Guava 的 Lists.partition(List<E>, int) 将指定的 List 分块为指定大小的子列表,这听起来完全适合您的用例。

    【讨论】:

      【解决方案3】:

      Guava,这是stupidly simple

      List<Foo> foos = /* whatever */;
      for (List<Foo> part : Lists.partition(foos, 40))
      {
          doSomethingWith(part);
      }
      

      【讨论】:

        【解决方案4】:

        Google 的Guava 有一个方法Lists.partition,它接受一个列表和一个分区大小,并返回一个列表列表。举个例子:

        List<Foo> fooList = new ArrayList<Foo>();
        //add 100 items to fooList
        List<List<Foo>> partitionedFoos = Lists.partition(fooList, 40);
        //A List containing 3 lists, the first two with 40 Foos, the last with 20.
        for(List<Foo> foos : paritionedFoos){
            bar(foos);
        }
        

        【讨论】:

          【解决方案5】:

          这样的事情应该可以在没有生成子列表列表的开销的情况下工作:

          void process(List<Thing> list) {
              final int len = list.size();
              if (len > 40) {
                  int start = 0;
                  do {
                      final end = Math.min(len, start + 40);
                      process(list.sublist(start, end));
                      start = end;
                  } while (start < len);
              } else {
                  // process list of length <= 40 here
              }
          }
          

          【讨论】:

          • 引用@skaffman“不,先生!我们应该自己重写这些现有的、已经在工作的实用程序,因为我们是合适的程序员!”
          • @MДΓΓБДLL - 并非每个 Java 项目都将 Guava 作为资源(例如,参见MДΓΓ БДLL 对 skaffman 的回复;仅使用标准 Java api 的答案很有价值。
          【解决方案6】:

          这是一个纯 Java 示例:

          public static void main(String[] args) {
              List<Integer> list = new ArrayList<Integer>();
              for (int i = 0; i < 100; i++) {
                  list.add(i);
              }
          
              for (int i = 0; i < (list.size()/40.0); i++) {
                  maxForty(list.subList(i * 40, Math.min(((i + 1) * 40), list.size())));
              }
          }
          
          public static void maxForty(List<Integer> list) {
              System.out.println("List size: " + list.size());
          }
          

          打印出来:

          List size: 40
          List size: 40
          List size: 20
          

          【讨论】:

            猜你喜欢
            • 2021-09-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多