JavaでCSVの読み込み(その3)
welcome-to-the-world.hatenablog.jp
今回はCSVの読み込みで利用するメソッドを準備しようと思います。
まずはBeanのフィールド一覧を取得するメソッドです。
/** * フィールドの一覧を取得 * * @param object Bean * @return フィールドの一覧 */ public static Field[] getFields(Object object) { return object.getClass().getDeclaredFields(); }
Objectで受け取っているのがBeanです。
任意で受け取るためObjectで宣言しています。
このメソッドでは前回作成したCsvColumnのannotation(number)の順で並んでない状態です。
そこで次のメソッドで CsvColumnのannotation(number)の順に並んだBeanのフィールド一覧を取得できるようにします。
/** * フィールドの一覧を取得(numberによるソートあり) * * @param object Bean * @return numberによりソートされたフィールドの一覧 */ public static SetgetSortedFields(Object object) { // Beanのフィールド一覧を取得 Field[] fieldList = getFields(object); // TreeSetを利用したソートの定義 Set sortedFields = new TreeSet<>((o1, o2) -> { CsvColumn column1 = o1.getAnnotation(CsvColumn.class); CsvColumn column2 = o2.getAnnotation(CsvColumn.class); return column1.number() - column2.number(); }); // Beanのフィールドに定義されているAnnotation(number)でソート for (Field field : fieldList) { if (field.getAnnotation(CsvColumn.class) != null) { sortedFields.add(field); } } // ソート結果を返す return sortedFields; }
先ほどのgetFields()メソッドを内部で呼び出し、Beanのフィールド一覧を取得します。
このField[]を20行目~でTreeSetクラス(13行目~)を利用してソート(16行目でannotation(number)を比較して昇順に並べて返します)しています。
このannotation(number)の順で並んだ戻り値(Set)がCSVの列の並びになります。
もう1つメソッドを用意します。
CsvColumnのannotation(number)の順で並んだフィールド名称の一覧を返すメソッドです。
このメソッドはCSVの読み込み結果をBeanに変換する際に利用します。
/** * Beanのフィールド名の一覧を取得(numberによるソートあり) * * @param object Bean * @return Beanのフィールド名の一覧 */ public static ListgetFieldNameList(Object object) { // Beanのフィールド一覧を取得(numberによるソートあり) Set sortedFields = CsvUtils.getSortedFields(object); // 戻り値を初期化 List fieldNameList = new ArrayList (); for (Field field : sortedFields) { // 取得したフィールド一覧からフィールド名を取得して戻り値に追加 fieldNameList.add(field.getName()); } // 戻り値を返す return fieldNameList; }
内部で
そのフィールドの一覧の各フィールドの名称(Naame)をArrayListに詰めて返します。(17行目)
最後にCsvColumnのannotation(number)の順で並んだヘッダー(annotation(label))を取得するメソッドを用意します。
このメソッドはCSVの読み込みでは使用しないのですが、将来的にCSVの書き込みを実装する際に利用できると思っています。
/** * Beanのラベルの一覧を取得(numberによるソートあり) * * @param object Bean * @return Beanのラベルの一覧 */ public static ListgetLabelList(Object object) { // Beanのフィールド一覧を取得(numberによるソートあり) Set sortedFields = CsvUtils.getSortedFields(object); // 戻り値を初期化 List labelList = new ArrayList (); for (Field field : sortedFields) { // BeanのフィールドのAnnotation(label)を取得 CsvColumn annotation = field.getAnnotation(CsvColumn.class); // labelの内容を戻り値に追加 labelList.add(annotation.label()); } // 戻り値を返す return labelList; }
内部で
そのフィールドの一覧のヘッダー(annotation(label))をArrayListに詰めて返します。(17行目~19行目)
次回はこれらのメソッドの挙動を見てみたいと思います。
その点はご了承ください。