将arraylist分成多个arraylists

时间:2012-07-16 01:24:19

标签: java

我的程序根据时间创建一个5000到60000条记录的arraylist。我想把它分成尽可能多的arraylists,每个arraylist将有1000条记录。我在网上看了很多例子并尝试了一些事情,但我遇到了一些奇怪的问题。你能告诉我一个这方面的例子吗?

问候!

2 个答案:

答案 0 :(得分:2)

  public static <T> Collection<Collection<T>> split(Collection<T> bigCollection, int maxBatchSize) {
    Collection<Collection<T>> result = new ArrayList<Collection<T>>();

    ArrayList<T> currentBatch = null;
    for (T t : bigCollection) {
      if (currentBatch == null) {
        currentBatch = new ArrayList<T>();
      } else if (currentBatch.size() >= maxBatchSize) {
        result.add(currentBatch);
        currentBatch = new ArrayList<T>();
      }

      currentBatch.add(t);
    }

    if (currentBatch != null) {
      result.add(currentBatch);
    }

    return result;
  }

以下是我们如何使用它(假设电子邮件是电子邮件地址的大型ArrayList:

Collection<Collection<String>> emailBatches = Helper.split(emails, 500);
    for (Collection<String> emailBatch : emailBatches) {
        sendEmails(emailBatch);
        // do something else...
        // and something else ...
    }
}

其中emailBatch会像这样迭代集合:

private static void sendEmails(Collection<String> emailBatch){
    for(String email: emailBatch){
        // send email code here.
    }
}

答案 1 :(得分:1)

您可以使用subList中的List http://docs.oracle.com/javase/6/docs/api/java/util/List.html#subList来分割您的ArrayList。子列表将为您提供原始列表的视图。如果你真的想要创建一个新列表,与旧列表分开,你可以这样做:

int index = 0;
int increment = 1000;
while ( index < bigList.size() ) {
   newLists.add(new ArrayList<Record>(bigList.subList(index,index+increment));
   index += increment;
}

请注意,您必须在此处检查一个错误。这只是一个快速的伪代码样本。