在Java中将较大的集合(集合,数组,列表)拆分为较小的集合,并跟踪最后返回的集合

2022-09-02 05:06:55
public Collection<Comment> getCommentCollection() {
   commentCollection = movie.getCommentCollection();       
   return split((List<Comment>) commentCollection, 4);
}

public Collection<Comment> split(List<Comment> list, int size){

     int numBatches = (list.size() / size) + 1;
     Collection[] batches = new Collection[numBatches];
     Collection<Comment> set = commentCollection;

     for(int index = 0; index < numBatches; index++) {
         int count = index + 1;
         int fromIndex = Math.max(((count - 1) * size), 0);
         int toIndex = Math.min((count * size), list.size());
         batches[index] = list.subList(fromIndex, toIndex);
         set = batches[index];
     }

     return set;
 }

我正在尝试将较大的集合拆分为较小的集合,具体取决于原始集合中的项目数。然后,每次调用 get 方法时返回一个较小的集合,同时跟踪返回的较小集合。我怎样才能做到这一点?


答案 1

也许我不明白这个问题,但这是列表的一部分:

List<E> subList(int fromIndex, int toIndex)

返回此列表中指定的 fromIndex(包括包含)和 toIndex(独占)之间的部分的视图。(如果 fromIndex 和 toIndex 相等,则返回的列表为空。返回的列表由此列表支持,因此返回列表中的非结构更改将反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。

此方法消除了对显式范围操作(数组中通常存在的那种)的需要。任何需要列表的操作都可以通过传递子列表视图而不是整个列表来用作范围操作。例如,以下成语从列表中删除一系列元素:

list.subList(from, to).clear();

docs.oracle.com/javase/1.5.0/docs/api/java/util/List.html


答案 2

这很简单:只需使用Guava的Lists.partition()即可。如果我正确地理解了你想要什么,那正是它所做的事情。