ArrayList has ArrayList

はじめに

前回のエントリから随分経っちゃったな….今回は自分のメモがてら,題目にあるようなことを実現する方法を記載しようと思う.ArrayList has ArrayList…つまり,ListがListを持つのである.これにより,インスタンス同士の親子関係を表現することができるようになる.前置きはこのあたりにして,以下に仕様やコードを記載するとしよう.

サンプルの仕様

今回使用するクラスを以下に示す.

  • Managerクラス

確認を行うためのテストクラス.属性として,parentList(ArrayList型)を持つ.
parentListには,Parentインスタンスが格納される.Parentクラスについては後述.

import java.util.ArrayList;
import java.util.List;

public class Manager {
    public static void main(String[] args) {
        List<Parent> parentList = new ArrayList<Parent>();

	//Parentインスタンスを生成して…
	Parent p1 = new Parent("田中");
	Parent p2 = new Parent("佐藤");
	Parent p3 = new Parent("伊藤");

	//parentListに格納する.
	parentList.add(p1);
	parentList.add(p2);
	parentList.add(p3);
	/*
	 * parentListの0番目:田中  1番目:佐藤  2番目:伊藤
	 * */
	//Childrenインスタンスを生成する.
	Children c1 = new Children("イチロー");
	Children c2 = new Children("ジロー");
	Children c3 = new Children("サブロー");
	Children c4 = new Children("シロー");
	Children c5 = new Children("ゴロー");
	Children c6 = new Children("ロクロー");

	//田中家にはイチローとジローとサブローがいる.
	parentList.get(0).childrenList.add(c1);
	parentList.get(0).childrenList.add(c2);
	parentList.get(0).childrenList.add(c3);

	//佐藤家にはシローとゴローがいる.
	parentList.get(1).childrenList.add(c4);
	parentList.get(1).childrenList.add(c5);

	//伊藤家にはロクローがいる.
	parentList.get(2).childrenList.add(c6);

        for(int i=0;i<parentList.size();i++) {
            Parent tmp = parentList.get(i);
	    System.out.println("【"+tmp.familyName+"家の住人】");
	    for(int j=0;j<tmp.childrenList.size();j++) {
                System.out.println(tmp.childrenList.get(j).name);
            }
        }
    }
}
  • Parentクラス

親クラス.属性として,familyName(String型),childrenList(ArrayList型)を持つ.
childrenListには,Childrenインスタンスが格納される.Childrenクラスについては後述.

import java.util.ArrayList;
import java.util.List;

public class Parent {
    String familyName;
    List<Children> childrenList = new ArrayList<Children>();

    //コンストラクタ
    Parent(String familyName) {
	this.familyName = familyName;
    }
}
  • Childrenクラス

子クラス.親であるParentクラスにぶら下がる形になっている.属性として,name(String型)を持つ.

public class Children {
    String name;

    //コンストラクタ
    Children(String name) {
        this.name = name;
    }
}

いろいろやっているが,要は

1.parentListを宣言して
2.Parentインスタンスを作って
3.作ったインスタンスをparentListに追加(add)して
4.i番目のparentListについて,Childrenインスタンスを作ってchildrenListに追加する

ということをやっているだけである.
ちなみに,上記を実行すると,以下のように表示される.

【田中家の住人】
イチロー
ジロー
サブロー
【佐藤家の住人】
シロー
ゴロー
【伊藤家の住人】
ロクロー

まとめ

ArrayList has ArrayListという題目で,親クラスと子クラスのインスタンスの親子関係を記述するサンプルを紹介した.
実際これがどこで活きてくるかと聞かれれば,うまく答えられる自信はないが,「こんなこともできるんだ」程度にとどめて頂ければ幸いだ.

ちなみに,parentListやchildrenListを宣言した時,左辺がListで右辺がArrayListになっている所が気になった方もいるかもしれない.かくいう自分もその一人で,これについても,メモがてら以下に参考文献として記載しておく.

参考文献