ヘルバ様の日常

テストを兼ねて色々試してみるブログです

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 Set getSortedFields(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 List getFieldNameList(Object object) {

    // Beanのフィールド一覧を取得(numberによるソートあり)
    Set sortedFields = CsvUtils.getSortedFields(object);

    // 戻り値を初期化
    List fieldNameList = new ArrayList();

    for (Field field : sortedFields) {
        // 取得したフィールド一覧からフィールド名を取得して戻り値に追加
        fieldNameList.add(field.getName());
    }

    // 戻り値を返す
    return fieldNameList;
}

 

内部でgetSortedFields()メソッドを呼び出してフィールドの一覧を取得します。

 

 

そのフィールドの一覧の各フィールドの名称(Naame)をArrayListに詰めて返します。(17行目)

 

 

最後にCsvColumnのannotation(number)の順で並んだヘッダー(annotation(label))を取得するメソッドを用意します。

 

 

このメソッドはCSVの読み込みでは使用しないのですが、将来的にCSVの書き込みを実装する際に利用できると思っています。

 

/**
 * Beanのラベルの一覧を取得(numberによるソートあり)
 * 
 * @param object Bean
 * @return Beanのラベルの一覧
 */
public static List getLabelList(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;
}

 

内部でgetSortedFields()メソッドを呼び出してフィールドの一覧を取得します。

 

 

そのフィールドの一覧のヘッダー(annotation(label))をArrayListに詰めて返します。(17行目~19行目)

 

  

次回はこれらのメソッドの挙動を見てみたいと思います。

 

ヘルバ様独自のコーディングで手法、動作は保証はできません^^;
その点はご了承ください。