リストを分割する
とある理由で下記のようにリストを分割する必要があった。
List<String> list = new ArrayList<String>(); for (int i=1; i<=10; i++) { list.add(String.valuOf(i)); } list.size(); // 10 List<List<String>> divided_list = getDividedList(list, 3); divided_list.size(); // 4 divided_list.get(0).size(); // 3 divided_list.get(1).size(); // 3 divided_list.get(2).size(); // 3 divided_list.get(3).size(); // 1
実装はこんな感じか。
public static <T> List<List<T>> getDividedList(List<T> list, int each_size) { List<List<T>> divided_list = new ArrayList<List<T>>(); int quotient = list.size() / each_size; int remainder = list.size() % each_size; for (int i=0; i<quotient; i++) { int offset = i*each_size; List<T> list0 = new ArrayList<T>(); for (int j=0; j< each_size; j++) { T v = list.get(offset + j); list0.add(v); } divided_list.add(list0); } if (remainder > 0) { int offset = quotient*each_size; List<T> list0 = new ArrayList<T>(); for (int j=0; j<remainder; j++) { T v = list.get(offset + j); list0.add(v); } divided_list.add(list0); } return divided_list; }
2016-02-26 追記
subListを使っても書ける。
public static <T> List<List<T>> getDividedList2(List<T> list, int each_size) { List<List<T>> divided_list = new ArrayList<List<T>>(); int quotient = list.size() / each_size; int remainder = list.size() % each_size; for (int i=0; i<quotient; i++) { int offset = i*each_size; List<T> sublist = list.subList(offset, offset + each_size); divided_list.add(sublist); } if (remainder > 0) { int offset = quotient*each_size; List<T> sublist = list.subList(offset, offset + remainder); divided_list.add(sublist); } return divided_list; }