Подтвердить что ты не робот

Разбить большую коллекцию (Коллекции, Массивы, Список) на меньшие коллекции в Java, а также отслеживать последнюю возвращенную коллекцию

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, отслеживая, какая меньшая коллекция возвращается. Как мне этого добиться?

4b9b3361

Ответ 1

private int runs = 0;

public void setRunsOneMore() {
    runs++;
}

    public void setRunsOneLess() {
    runs--;
}

public Collection<Comment> getCommentCollection() {
    commentCollection = movie.getCommentCollection();
    Collection[] com = split((List<Comment>) commentCollection,4);
    try{
        return com[runs];
     } catch(ArrayIndexOutOfBoundsException e) {
       runs = 0;
      }
    return com[runs];
}

public Collection[] 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);
     }

     return batches;
 }

Установка текущего "прогона" со следующими и предыдущими действиями кнопок

public String userNext() {
    userReset(false);
    getUserPagingInfo().nextPage();
    movieController.setRunsOneMore();
    return "user_movie_detail";
}

public String userPrev() {
    userReset(false);
    getUserPagingInfo().previousPage();
    movieController.setRunsOneLess();
    return "user_movie_detail";
}

Ответ 2

Возможно, я не понимаю вопроса, но это часть списка:

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

Возвращает представление части этого списка между указанным fromIndex, inclusive и toIndex, исключительным. (Если fromIndex и toIndex равны, возвращаемый список пуст.) Возвращенный список поддерживается этим списком, поэтому неструктурные изменения в возвращенном списке отражаются в этом списке и наоборот. Возвращенный список поддерживает все дополнительные операции с списком, поддерживаемые этим списком.

Этот метод устраняет необходимость в явных операциях диапазона (такого типа, который обычно существует для массивов). Любая операция, которая ожидает список, может использоваться как операция диапазона, передавая представление сублиста вместо целого списка. Например, следующая идиома удаляет ряд элементов из списка:

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

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

Ответ 3

Это просто: просто используйте Lists.partition() из Guava. Если я правильно понимаю, что вы хотите, это именно то, что он делает.

Ответ 4

Я не совсем уверен, что вы спрашиваете... вы хотите удалить первые 4 элемента из исходного Collection, прежде чем возвращать их, чтобы вы получили следующие 4 при следующем вызове метода? Если это так, вы можете просто использовать Iterator:

Iterator<Comment> iter = commentCollection.iterator();
while (iter.hasNext() && group.size() < 4) {
  group.add(iter.next());
  iter.remove();
}

Тем самым вы уничтожаете коллекцию объектов movie для комментариев (если только она не возвращает копию этой коллекции каждый раз, и в этом случае вышеуказанное не будет работать вообще). Я предполагаю, что вы пытаетесь сделать что-то вроде пейджинга, и в этом случае я предлагаю сделать что-то другое, например разделение a List комментарии с размером 4 и отслеживание текущего индекса (страницы) в этом списке разделов.

Ответ 5

public static <E extends Object> List<List<E>> split(Collection<E> input, int size) {\n
    List<List<E>> master = new ArrayList<List<E>>();
    if (input != null && input.size() > 0) {
        List<E> col = new ArrayList<E>(input);
        boolean done = false;
        int startIndex = 0;
        int endIndex = col.size() > size ? size : col.size();
        while (!done) {
            master.add(col.subList(startIndex, endIndex));
            if (endIndex == col.size()) {
                done = true;
            }
            else {
                startIndex = endIndex;
                endIndex = col.size() > (endIndex + size) ? (endIndex + size) : col.size();
            }
        }
    }
    return master;
}

Ответ 6

Вы можете использовать Vector.remove(collection), например:

public Collection<Comment> getCommentCollection() {
    commentCollection = movie.getCommentCollection();
    Vector<Comment> group = new Vector<Comment>();
    for (Comment com:commentCollection){
        group.add(com);
    if(group.size() == 4){
        break;
    }
    }
    movie.getCommentCollection().remove(commentCollection);
    return commentCollection;
}

Предполагая, что movie.getCommentCollection() также является вектором