最大で1,000要素になる可能性があるリストで、もし800要素以上ある場合は800要素以下のリストと残りの要素のリストに分けたい
これはJavaでどうするんだっけ?と思ったので調べた
List.subList を使う
List.subList
というのがあったので、普通にこれを使うのが良さそう
https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html#subList-int-int-
List<E> subList(int fromIndex, int toIndex)
指定されたfromIndexからtoIndexまでの部分のビューを返す
fromIndexとtoIndexが等しい場合は、空のリストが返される
public static <T> List<List<T>> splitList(List<T> list, int maxSize) { List<List<T>> splittedLists = new ArrayList<>(); // 元のリストが800要素以上の場合に分割 if (list.size() > maxSize) { splittedLists.add(list.subList(0, maxSize)); splittedLists.add(list.subList(maxSize, list.size())); } else { // 元のリストが800要素以下の場合、そのまま返す splittedLists.add(list); splittedLists.add(new ArrayList<>()); } return splittedLists; }
Arrays.copyOfRangeを使う
Listを配列に変換しArrays.copyOfRange
を使うこともできそう
public static <T> List<List<T>> splitList(List<T> list, int maxSize) { List<List<T>> splittedLists = new ArrayList<>(); // リストを配列に変換 T[] array = (T[]) list.toArray(); // 元のリストが800要素以上の場合に分割 if (array.length > maxSize) { T[] firstArray = Arrays.copyOfRange(array, 0, maxSize); T[] secondArray = Arrays.copyOfRange(array, maxSize, array.length); // 配列をリストに戻す splittedLists.add(Arrays.asList(firstArray)); splittedLists.add(Arrays.asList(secondArray)); } else { // 元のリストが800要素以下の場合、そのまま返す splittedLists.add(list); splittedLists.add(new ArrayList<>()); } return splittedLists; }