リストを分割する

とある理由で下記のようにリストを分割する必要があった。

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