4 * License : The MIT License
\r
5 * Copyright(c) 2010 MikuToga Partners
\r
8 package jp.sourceforge.mikutoga.corelib;
\r
10 import java.lang.reflect.Constructor;
\r
11 import java.lang.reflect.InvocationTargetException;
\r
12 import java.util.Collection;
\r
13 import java.util.List;
\r
18 public final class ListUtil {
\r
25 throw new AssertionError();
\r
29 * リストの出現順にシリアルナンバーを割り振る。
\r
31 * @param list リスト。なるべく{@link java.util.RandomAccess}型が望ましい。
\r
33 public static void assignIndexedSerial(
\r
34 List<? extends SerialNumbered> list){
\r
35 int size = list.size();
\r
36 for(int idx = 0; idx < size; idx++){
\r
37 SerialNumbered numbered = list.get(idx);
\r
38 numbered.setSerialNumber(idx);
\r
45 * 追加された要素にはnullが収められる。
\r
46 * コレクションがすでに指定サイズ以上の要素数を持つ場合、何もしない。
\r
48 * @param coll コレクション
\r
49 * @param newSize 新サイズ
\r
51 public static <E> void extendCollection(Collection<E> coll, int newSize){
\r
52 int remain = newSize - coll.size();
\r
53 if(remain <= 0) return;
\r
55 for(int ct = 1; ct <= remain; ct++){
\r
59 assert coll.size() == newSize;
\r
65 * リストのnull要素をデフォルトコンストラクタによるインスタンスで埋める。
\r
66 * null要素がなければなにもしない。
\r
69 * @param cons コンストラクタ
\r
72 public static <E> int fillDefCons(List<E> list,
\r
73 Constructor<? extends E> cons){
\r
76 int size = list.size();
\r
77 for(int pt = 0; pt < size; pt++){
\r
78 E elem = list.get(pt);
\r
79 if(elem != null) continue;
\r
82 elem = cons.newInstance();
\r
83 }catch(InstantiationException e){
\r
85 throw new AssertionError(e);
\r
86 }catch(IllegalAccessException e){
\r
88 throw new AssertionError(e);
\r
89 }catch(InvocationTargetException e){
\r
90 Throwable cause = e.getTargetException();
\r
91 if(cause instanceof RuntimeException){
\r
92 throw (RuntimeException) cause;
\r
94 if(cause instanceof Error){
\r
95 throw (Error) cause;
\r
98 throw new AssertionError(e);
\r
101 list.set(pt, elem);
\r
109 * リストのnull要素をデフォルトコンストラクタによるインスタンスで埋める。
\r
112 * @param klass デフォルトコンストラクタの属するクラス
\r
115 public static <E> int fillDefCons(List<E> list, Class<? extends E> klass){
\r
116 Constructor<? extends E> cons;
\r
118 cons = klass.getConstructor();
\r
119 }catch(NoSuchMethodException e){
\r
121 throw new AssertionError(e);
\r
124 return fillDefCons(list, cons);
\r
128 * リスト要素数の拡張とデフォルトコンストラクタによる要素埋めを行う。
\r
129 * 追加された要素および既存のnull要素には
\r
130 * デフォルトコンストラクタによるインスタンスが収められる。
\r
133 * @param klass デフォルトコンストラクタの属するクラス
\r
134 * @param newSize 新サイズ
\r
137 public static <E> int prepareDefConsList(List<E> list,
\r
138 Class<? extends E> klass,
\r
140 extendCollection(list, newSize);
\r
141 int result = fillDefCons(list, klass);
\r