Listをsplit
書いてみた。
public final class ListUtils { private ListUtils() {} public static <E> List<List<E>> split(List<E> list, E delim, SplitMode mode) { if (list == null || mode == null) { throw new NullPointerException(); } List<List<E>> result = new ArrayList<List<E>>(); List<E> crnt = new ArrayList<E>(); for (E e : list) { if ((delim == null && e == null) || (delim != null && delim.equals(e))) { if (mode.isAddElem(crnt)) { result.add(crnt); crnt = new ArrayList<E>(); } } else { crnt.add(e); } } if (crnt.size() != 0 && !crnt.get(0).equals(delim)) result.add(crnt); return result; } public static <E> List<List<E>> split(List<E> list, E delim) { return split(list, delim, SplitMode.NOT_ACCEPT_EMPTY_ELEM); } public static enum SplitMode { ACCEPT_EMPTY_ELEM { boolean isAddElem(List<?> elem) { return true; } }, NOT_ACCEPT_EMPTY_ELEM { boolean isAddElem(List<?> elem) { return elem.size() != 0; } }; abstract boolean isAddElem(List<?> elem); } }
使い方は
List<String> list = Arrays.asList("hoge", "", "piyo", "foo", "", "bar"); List<List<String>> splitList = ListUtils.split(list, ""); for (List<String> l : splitList) { // [hoge] // [piyo, foo] // [bar] System.out.println(l); }
こんな感じ。ファイルからListとして読み込んで空行で区切るようなイメージ。
モードは2つしか思いつかなかったからbooleanでいいな。