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
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";
}
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();
C'est simple: utilisez simplement Lists.partition()
de Guava. Si je comprends bien ce que vous voulez, c'est exactement ce que ça fait.
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.
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;
}
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