web-dev-qa-db-ja.com

大きなコレクション(コレクション、配列、リスト)を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メソッドが呼び出されるたびに、小さいコレクションの1つを返します。どうすればこれを達成できますか?

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

次および前のボタンアクションで現在の「実行」を設定する

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

多分私は質問を理解していませんが、これはリストの一部です:

_List<E> subList(int fromIndex, int toIndex)
_

指定されたfromIndex(これを含む)とtoIndex(これを含まない)の間のリストの部分のビューを返します。 (fromIndexとtoIndexが等しい場合、返されるリストは空です。)返されるリストはこのリストに基づいているため、返されるリストの非構造的な変更はこのリストに反映され、逆も同様です。返されるリストは、このリストでサポートされているすべてのオプションのリスト操作をサポートしています。

この方法では、明示的な範囲操作(配列に一般的に存在する種類の操作)が不要になります。リストが必要なすべての操作は、リスト全体ではなくsubListビューを渡すことにより、範囲操作として使用できます。たとえば、次のイディオムは、リストから要素の範囲を削除します。

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

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

41
Thufir

これは簡単です:Guavaの Lists.partition() を使用するだけです。私があなたが何を望んでいるかを正しく理解していれば、それはまさにそれがすることです。

16

質問の内容がよくわかりません...最初の4つの項目をソースCollectionから削除してから返して、次回にメソッドを呼び出すときに次の4つを取得しますか? ?その場合は、Iteratorを使用できます。

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

ただし、これを行うと、movieオブジェクトのコメントのコレクションが破棄されます(ただし、毎回そのコレクションのコピーが返される場合は除きます。その場合、上記はまったく機能しません)。ページングのようなことをしようとしていると思いますが、その場合は partitioning a Listのようなサイズ4のコメントを付けて追跡することをお勧めしますそのパーティションリスト内の現在のインデックス(ページ)。

2
ColinD

ArrayListコンストラクターを使用して、元のリストのディープコピーである依存サブリストを作成できます。

import Java.util.ArrayList;
import Java.util.List;

class Scratch {
    public static void main(String[] args) {
        final List<String> parent = new ArrayList<>();
        parent.add("One");
        parent.add("Two");
        parent.add("Three");

        // using the ArrayList constructor here
        final List<String> copy = new ArrayList<>(parent.subList(0, 2));

        // modifying the new list doesn't affect the original
        copy.remove(0);

        // outputs:
        // parent: [One, Two, Three]
        // copy:   [Two]
        System.out.println("parent: " + parent);
        System.out.println("copy:   " + copy);
    }
}
1
Ahmed Rezk
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

これが私の実装です。それが役に立てば幸い!

依存関係CollectionUtilsおよびLists参照: https:/ /mvnrepository.com/artifact/org.Apache.commons/commons-lang3/

/**
 * efficient collection partition
 *
 * @param baseCollection base collection to split
 * @param maxSize max element size of each sublist returned
 * @param balancing whether each of sublists returned needs size balancing
 * @return list of sublists, whose order bases on the base collection's iterator implementation
 * @since 2020/03/12
 */
public static <T> List<List<T>> partition(final Collection<T> baseCollection, int maxSize, boolean balancing) {

    if (CollectionUtils.isEmpty(baseCollection)) {
        return Collections.emptyList();
    }

    int size = baseCollection.size() % maxSize == 0 ? baseCollection.size()/maxSize : baseCollection.size()/maxSize+1;
    if (balancing) {
        maxSize = baseCollection.size() % size == 0 ? baseCollection.size()/size : baseCollection.size()/size+1;
    }
    int fullElementSize = baseCollection.size() % size == 0 ? size : baseCollection.size() % size;

    List<List<T>> result = Lists.newArrayListWithExpectedSize(size);
    Iterator<T> it = baseCollection.iterator();
    for (int i = 0; i < size; i++) {
        if (balancing && i == fullElementSize) {
            maxSize--;
        }
        maxSize = Math.min(maxSize, baseCollection.size()-i*maxSize);

        List<T> subList = Lists.newArrayListWithExpectedSize(maxSize);
        for (int i1 = 0; i1 < maxSize; i1++) {
            if (it.hasNext()) {
                subList.add(it.next());
            } else {
                break;
            }
        }
        result.add(subList);
    }

    return result;
}
0
charm

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()もベクトルであると想定

0
Noam Nevo