OSDN Git Service

PMD出力機能及びXML入出力機能のソースをマージ
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / corelib / ListUtil.java
diff --git a/src/main/java/jp/sourceforge/mikutoga/corelib/ListUtil.java b/src/main/java/jp/sourceforge/mikutoga/corelib/ListUtil.java
new file mode 100644 (file)
index 0000000..af9e099
--- /dev/null
@@ -0,0 +1,145 @@
+/*\r
+ * List utilities\r
+ *\r
+ * License : The MIT License\r
+ * Copyright(c) 2010 MikuToga Partners\r
+ */\r
+\r
+package jp.sourceforge.mikutoga.corelib;\r
+\r
+import java.lang.reflect.Constructor;\r
+import java.lang.reflect.InvocationTargetException;\r
+import java.util.Collection;\r
+import java.util.List;\r
+\r
+/**\r
+ * リスト構造の各種ユーティリティ。\r
+ */\r
+public final class ListUtil {\r
+\r
+    /**\r
+     * 隠しコンストラクタ。\r
+     */\r
+    private ListUtil(){\r
+        assert false;\r
+        throw new AssertionError();\r
+    }\r
+\r
+    /**\r
+     * リストの出現順にシリアルナンバーを割り振る。\r
+     * シリアルナンバー先頭は0。\r
+     * @param list リスト。なるべく{@link java.util.RandomAccess}型が望ましい。\r
+     */\r
+    public static void assignIndexedSerial(\r
+            List<? extends SerialNumbered> list){\r
+        int size = list.size();\r
+        for(int idx = 0; idx < size; idx++){\r
+            SerialNumbered numbered = list.get(idx);\r
+            numbered.setSerialNumber(idx);\r
+        }\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * コレクションの要素数を拡張する。\r
+     * 追加された要素にはnullが収められる。\r
+     * コレクションがすでに指定サイズ以上の要素数を持つ場合、何もしない。\r
+     * @param <E> 型\r
+     * @param coll コレクション\r
+     * @param newSize 新サイズ\r
+     */\r
+    public static <E> void extendCollection(Collection<E> coll, int newSize){\r
+        int remain = newSize - coll.size();\r
+        if(remain <= 0) return;\r
+\r
+        for(int ct = 1; ct <= remain; ct++){\r
+            coll.add(null);\r
+        }\r
+\r
+        assert coll.size() == newSize;\r
+\r
+        return;\r
+    }\r
+\r
+    /**\r
+     * リストのnull要素をデフォルトコンストラクタによるインスタンスで埋める。\r
+     * null要素がなければなにもしない。\r
+     * @param <E> 型\r
+     * @param list リスト\r
+     * @param cons コンストラクタ\r
+     * @return 埋めた数\r
+     */\r
+    public static <E> int fillDefCons(List<E> list,\r
+                                      Constructor<? extends E> cons){\r
+        int result = 0;\r
+\r
+        int size = list.size();\r
+        for(int pt = 0; pt < size; pt++){\r
+            E elem = list.get(pt);\r
+            if(elem != null) continue;\r
+\r
+            try{\r
+                elem = cons.newInstance();\r
+            }catch(InstantiationException e){\r
+                assert false;\r
+                throw new AssertionError(e);\r
+            }catch(IllegalAccessException e){\r
+                assert false;\r
+                throw new AssertionError(e);\r
+            }catch(InvocationTargetException e){\r
+                Throwable cause = e.getTargetException();\r
+                if(cause instanceof RuntimeException){\r
+                    throw (RuntimeException) cause;\r
+                }\r
+                if(cause instanceof Error){\r
+                    throw (Error) cause;\r
+                }\r
+                assert false;\r
+                throw new AssertionError(e);\r
+            }\r
+\r
+            list.set(pt, elem);\r
+            result++;\r
+        }\r
+\r
+        return result;\r
+    }\r
+\r
+    /**\r
+     * リストのnull要素をデフォルトコンストラクタによるインスタンスで埋める。\r
+     * @param <E> 型\r
+     * @param list リスト\r
+     * @param klass デフォルトコンストラクタの属するクラス\r
+     * @return 埋めた数\r
+     */\r
+    public static <E> int fillDefCons(List<E> list, Class<? extends E> klass){\r
+        Constructor<? extends E> cons;\r
+        try{\r
+            cons = klass.getConstructor();\r
+        }catch(NoSuchMethodException e){\r
+            assert false;\r
+            throw new AssertionError(e);\r
+        }\r
+\r
+        return fillDefCons(list, cons);\r
+    }\r
+\r
+    /**\r
+     * リスト要素数の拡張とデフォルトコンストラクタによる要素埋めを行う。\r
+     * 追加された要素および既存のnull要素には\r
+     * デフォルトコンストラクタによるインスタンスが収められる。\r
+     * @param <E> 型\r
+     * @param list リスト\r
+     * @param klass デフォルトコンストラクタの属するクラス\r
+     * @param newSize 新サイズ\r
+     * @return 埋めた数。\r
+     */\r
+    public static <E> int prepareDefConsList(List<E> list,\r
+                                             Class<? extends E> klass,\r
+                                             int newSize ){\r
+        extendCollection(list, newSize);\r
+        int result = fillDefCons(list, klass);\r
+        return result;\r
+    }\r
+\r
+}\r