Как получить коллекцию из Java-коллекции (Collections, Arrays, List) и отслеживать последний возвращенный - PullRequest
18 голосов
/ 07 марта 2011
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 (отслеживаниекто это?) Может кто-нибудь мне помочь?
Большое спасибо.
Игнасио

Ответы [ 6 ]

41 голосов
/ 07 апреля 2012

Может быть, я не понимаю вопроса, но это часть List:

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

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

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

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

docs.oracle.com / javase / 1.5.0 / docs /апи / Java / Util / list.html

16 голосов
/ 09 марта 2011

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

3 голосов
/ 08 марта 2011
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 голосов
/ 07 марта 2011

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

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

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

1 голос
/ 21 ноября 2012
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;
}
0 голосов
/ 07 марта 2011

Вы можете использовать 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 () также является вектором

...