OSDN Git Service

1.105.3-SNAPSHOT版開発開始
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / corelib / ListUtil.java
1 /*\r
2  * List utilities\r
3  *\r
4  * License : The MIT License\r
5  * Copyright(c) 2010 MikuToga Partners\r
6  */\r
7 \r
8 package jp.sourceforge.mikutoga.corelib;\r
9 \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
14 \r
15 /**\r
16  * リスト構造の各種ユーティリティ。\r
17  */\r
18 public final class ListUtil {\r
19 \r
20     /**\r
21      * 隠しコンストラクタ。\r
22      */\r
23     private ListUtil(){\r
24         assert false;\r
25         throw new AssertionError();\r
26     }\r
27 \r
28     /**\r
29      * リストの出現順にシリアルナンバーを割り振る。\r
30      * シリアルナンバー先頭は0。\r
31      * @param list リスト。なるべく{@link java.util.RandomAccess}型が望ましい。\r
32      */\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
39         }\r
40         return;\r
41     }\r
42 \r
43     /**\r
44      * コレクションの要素数を拡張する。\r
45      * 追加された要素にはnullが収められる。\r
46      * コレクションがすでに指定サイズ以上の要素数を持つ場合、何もしない。\r
47      * @param <E> 型\r
48      * @param coll コレクション\r
49      * @param newSize 新サイズ\r
50      */\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
54 \r
55         for(int ct = 1; ct <= remain; ct++){\r
56             coll.add(null);\r
57         }\r
58 \r
59         assert coll.size() == newSize;\r
60 \r
61         return;\r
62     }\r
63 \r
64     /**\r
65      * リストのnull要素をデフォルトコンストラクタによるインスタンスで埋める。\r
66      * null要素がなければなにもしない。\r
67      * @param <E> 型\r
68      * @param list リスト\r
69      * @param cons コンストラクタ\r
70      * @return 埋めた数\r
71      */\r
72     public static <E> int fillDefCons(List<E> list,\r
73                                       Constructor<? extends E> cons){\r
74         int result = 0;\r
75 \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
80 \r
81             try{\r
82                 elem = cons.newInstance();\r
83             }catch(InstantiationException e){\r
84                 assert false;\r
85                 throw new AssertionError(e);\r
86             }catch(IllegalAccessException e){\r
87                 assert false;\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
93                 }\r
94                 if(cause instanceof Error){\r
95                     throw (Error) cause;\r
96                 }\r
97                 assert false;\r
98                 throw new AssertionError(e);\r
99             }\r
100 \r
101             list.set(pt, elem);\r
102             result++;\r
103         }\r
104 \r
105         return result;\r
106     }\r
107 \r
108     /**\r
109      * リストのnull要素をデフォルトコンストラクタによるインスタンスで埋める。\r
110      * @param <E> 型\r
111      * @param list リスト\r
112      * @param klass デフォルトコンストラクタの属するクラス\r
113      * @return 埋めた数\r
114      */\r
115     public static <E> int fillDefCons(List<E> list, Class<? extends E> klass){\r
116         Constructor<? extends E> cons;\r
117         try{\r
118             cons = klass.getConstructor();\r
119         }catch(NoSuchMethodException e){\r
120             assert false;\r
121             throw new AssertionError(e);\r
122         }\r
123 \r
124         return fillDefCons(list, cons);\r
125     }\r
126 \r
127     /**\r
128      * リスト要素数の拡張とデフォルトコンストラクタによる要素埋めを行う。\r
129      * 追加された要素および既存のnull要素には\r
130      * デフォルトコンストラクタによるインスタンスが収められる。\r
131      * @param <E> 型\r
132      * @param list リスト\r
133      * @param klass デフォルトコンストラクタの属するクラス\r
134      * @param newSize 新サイズ\r
135      * @return 埋めた数。\r
136      */\r
137     public static <E> int prepareDefConsList(List<E> list,\r
138                                              Class<? extends E> klass,\r
139                                              int newSize ){\r
140         extendCollection(list, newSize);\r
141         int result = fillDefCons(list, klass);\r
142         return result;\r
143     }\r
144 \r
145 }\r