web-dev-qa-db-fra.com

Comment obtenir des sous-collections de collections de formulaires Java (Collections, Arrays, List) et garder trace de la dernière

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;
 }

Bonjour, j’essaie de diviser une collection en collections plus petites, en fonction du nombre d’articles de la collection "mère", et de renvoyer une de ces collections plus petites chaque fois que la méthode get est appelée (en gardant une trace de celle-ci), Quelqu'un peut me donner un coup de main? 
Merci beaucoup.
Ignacio 

17
Ignacio Garat
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;
 }

Définition de la "course" en cours avec les actions de bouton suivantes et précédentes

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";
}
3
Ignacio Garat

Peut-être que je ne comprends pas la question, mais cela fait partie de la liste:

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

Renvoie une vue de la partie de cette liste entre l'élément fromIndex, inclus, et toIndex, exclusif. (Si fromIndex et toIndex sont égaux, la liste renvoyée est vide.) La liste renvoyée est sauvegardée par cette liste. Par conséquent, les modifications non structurelles de la liste renvoyée sont reflétées dans cette liste et inversement. La liste renvoyée prend en charge toutes les opérations de liste facultatives prises en charge par cette liste.

Cette méthode élimine le besoin d'opérations de plage explicites (du type qui existe couramment pour les tableaux). Toute opération qui attend une liste peut être utilisée comme une opération d'intervalle en passant une vue sous-liste au lieu d'une liste complète. Par exemple, l'idiome suivant supprime une plage d'éléments d'une liste:

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

docs.Oracle.com/javase/1.5.0/docs/api/Java/util/List.html

38
Thufir

C'est simple: utilisez simplement Lists.partition() de Guava. Si je comprends bien ce que vous voulez, c'est exactement ce que ça fait.

16

Je ne suis pas tout à fait sûr de ce que vous demandez ... voulez-vous supprimer les 4 premiers éléments de la source Collection avant de les renvoyer, afin que vous obteniez les 4 prochains lors de l'appel suivant de la méthode? Si tel est le cas, vous pouvez simplement utiliser la variable Iterator:

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

En procédant ainsi, vous détruiriez la collection de commentaires de l’objet movie (à moins qu’il ne renvoie une copie de cette collection à chaque fois, auquel cas la procédure ci-dessus ne fonctionnerait pas du tout). Je suppose que vous essayez de faire quelque chose comme la pagination, auquel cas je suggérerais de faire quelque chose de différent, comme partitioning a List de commentaires de taille 4 et de garder la trace d'un index actuel (la page) liste de partition.

2
ColinD
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;
}
1
snupers

Vous pouvez utiliser Vector.remove (collection), exemple:

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 () est également un vecteur

0
Noam Nevo