頭脳一式

人の記憶なんて曖昧なもの。すべての情報を頭に記憶するなんてナンセンス。困ったらここに来ればいいじゃん?というスタンスで最強のナレッジベースを目指すブログ

【Java】Listの中にListを入れる(Listの入れ子構造)

完成図

先に、これから作るロジックの完成図のイメージ図を載せます。
f:id:shiakisudev:20180728231512p:plain

【解説】
クラス「MasterDataList」は複数のデータクラスを管理するためのクラスです。
クラス「vegetableData」は、野菜の情報を格納するためのクラスです。
クラス「fruitsData」は、果物の情報を格納するためのクラスです。

作り方

1.子データクラスを作る。

図中のvegetableDataクラスとfruitsDataクラスを作ります。
クラス内に以下を用意します。

  • メンバ変数name,value.flg
  • 上記のセッター/ゲッター
  • 値確認用のOverrideしたtoString()メソッド

以下はvegetableDataクラスの例です。(これと同じ要領でfruitsDataクラスも作ります。)

public class vegetableData{
    private String    name;
    private int        value;
    private boolean    flg;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }

    public boolean isFlg() {
        return flg;
    }
    public void setFlg(boolean flg) {
        this.flg = flg;
    }

    @Override
    public String toString(){
        return name + "," + value + "," + flg;

    }
}

2.子データクラス格納用の親データクラスを作る。

図中のvegetableDataとfruitsDataのList型を格納するためのクラス「MasterDataList」を作ります。
中身としてメンバ変数vegeInfoとfruitsInfoをList型で定義し、セッター/ゲッターを用意します。

public class MasterDataList{
    public List<vegetableData> vegeInfo;
    public List<fruitsData> fruitsInfo;

    public List<vegetableData> getVegeInfo() {
        return vegeInfo;
    }

    public void setVegeInfo(List<vegetableData> list) {
        this.vegeInfo = list;
    }

    public List<fruitsData> getFruitsInfo() {
        return fruitsInfo;
    }

    public void setFruitsInfo(List<fruitsData> fruitsInfo) {
        this.fruitsInfo = fruitsInfo;
    }
}

3.データの生成・格納・出力

public static void main(String[] args) {
    List<MasterDataList> MstList = new ArrayList<MasterDataList>();
    MasterDataList Mdata;

//以下vegetableDataの編集--------------------------------------
    List<vegetableData> list;
    vegetableData data;

    //1件目のListを生成
    Mdata = new MasterDataList();
    list = new ArrayList<vegetableData>();
    data = new vegetableData();

    data.setName("玉ねぎ");
    data.setValue(30);
    data.setFlg(true);
    list.add(data);

    data = new vegetableData();
    data.setName("人参");
    data.setValue(100);
    data.setFlg(true);
    list.add(data);

    data = new vegetableData();
    data.setName("じゃがいも");
    data.setValue(50);
    data.setFlg(true);
    list.add(data);

    //1件目のListを格納
    Mdata.setVegeInfo(list);
    MstList.add(Mdata);

    //2件目のListを生成
    Mdata = new MasterDataList();
    list = new ArrayList<vegetableData>();
    data = new vegetableData();

    data.setName("大根");
    data.setValue(100);
    data.setFlg(true);
    list.add(data);

    data = new vegetableData();
    data.setName("白菜");
    data.setValue(200);
    data.setFlg(true);
    list.add(data);

    data = new vegetableData();
    data.setName("きゅうり");
    data.setValue(30);
    data.setFlg(true);
    list.add(data);

    //2件目のListを格納
    Mdata.setVegeInfo(list);
    MstList.add(Mdata);

//以下fruitsDataの編集--------------------------------------
    List<fruitsData> list2;
    fruitsData data2;

    //3件目のListを生成
    Mdata = new MasterDataList();
    list2 = new ArrayList<fruitsData>();
    data2 = new fruitsData();

    data2.setName("バナナ");
    data2.setValue(100);
    data2.setFlg(true);
    list2.add(data2);

    data2 = new fruitsData();
    data2.setName("レモン");
    data2.setValue(150);
    data2.setFlg(true);
    list2.add(data2);

    data2 = new fruitsData();
    data2.setName("リンゴ");
    data2.setValue(200);
    data2.setFlg(true);
    list2.add(data2);

    //3件目のListを格納
    Mdata.setFruitsInfo(list2);
    MstList.add(Mdata);

//以下、出力結果--------------------------------------
    System.out.println(MstList.get(0).getVegeInfo());//1件目のListを出力
    System.out.println(MstList.get(1).getVegeInfo());//2件目のListを出力
    System.out.println(MstList.get(2).getFruitsInfo());//3件目のListを出力

}

【出力結果】
[玉ねぎ,30,true, 人参,100,true, じゃがいも,50,true]
[大根,100,true, 白菜,200,true, きゅうり,30,true]
[バナナ,100,true, レモン,150,true, リンゴ,200,true]

総評

なんかいろいろ応用できそうです。