Generics版 ArrayList利用

ArrayListは、自動的に配列大きさが増加する 任意オブジェクトの配列を管理するクラスです。 (このような配列は可変長配列と呼ばれます)
通常の配列は最初に要素数を決めてその要素数は変化しません。 対してArrayListの内部配列は、addメソッドを使うことで 自動的に増えていきます。
この配列要素に添え字を指定してオブジェクトを設定する時は、 setメソッドを使います。
また、添え字を指定してこの配列要素を取得する場合は、 getメソッドを使います。
そして、内部配列で管理される要素数は、lengthでなく、代わりに sizeメソッドで取得します。
次の例では、空の可変長配列オブジェクトを変数 lst で管理させ、 そこにRecord2のオブジェクト3つ追加(add)します。 それぞれのオブジェクトは、 追加の順番で内部的に0,1,2の添え字で管理されます。
その後、1の添え字要素をRecord3のオブジェクトに設定(set)し直し、 各要素を順番に取得(get)して表示します。 この表示は、0番目から要素数(size)未満の繰り返しで、 全て表示するプログラムです。

import java.util.ArrayList;
import rec.Record2;
import rec.Record3;

public class Test
{
	public static void main(String[] arg) throws Exception
	{
		ArrayList<Record2> lst = new ArrayList<Record2>();

		lst.add(new Record2("A01", 10));//追加により、自動的に内部サイズが増えます。
		lst.add(new Record2("A02", 20));
		lst.add(new Record2("C03", 30));

		lst.set(1, new Record3("B02", 20, 200)); //1の添え字要素を、生成したRecord3へ変更
		
		for(int i=0; i < lst.size(); i++){
			Record2 rec = lst.get(i);	//i番目要素
			rec.display(i);
		}
	}
}

  の2行は、 lst.get(i).display(i);の 一行にまとめることができます。
以下に、この実行を示します。

Z:\java>java Test
   0番目レコード
        商品コード:A01
        数量:10
   1番目レコード
        商品コード:B02
        数量:20
        単価:200
   2番目レコード
        商品コード:C03
        数量:30

Z:\java>

なお、上記の,<Record2>の部分が、 Genericsの部分に指定した利用する時の型指定です。
このような可変長配列のコードはどのようになっているのでしょうか?  実際のコードは、JDKのインストールディレクトリの中のsrc.zip内の java.utilパッケージにあり、実際のコードを見るのが良いでしょう。
上記を実行できる限定版のArrayListであれば次のように作れます。 (実際のjava.util.ArrayListコードはもっと複雑ですが、Genericsの例として参考に示します)

public class ArrayList <T>{
	private int upSize=3;
	T [] data= (T [])new Object[upSize];
	int size=0;
	public boolean add(T obj){
		if(size >= data.length){//記憶できるようにサイズ拡大
			T [] temp = (T [])new Object[data.length + upSize];
			System.arraycopy(data, 0, temp, 0, data.length);//tempにdata全要素をコピー
			data = temp; // 増やした新しい配列に置き換える。
		}
		data[size++] = obj;
		return true;
	}
	public int size(){//サイズ取得
		return this.size;
	}
	public T get(int index){//要素取得
		return data[index];
	} 
	public T set(int index , T obj){//要素変更
		T rtnObj = data[index];
		data[index] = obj;
		return rtnObj;
	}
}

これを使って、メニュー操作で追加と変更ができる簡単な作品を紹介します。

右が実行例です。
メニュー操作で、 3件のRecord2を追加しています。

その後、変更を選んで、 1の添え字を指定して、 それをRecord2オブジェクトに変更し、
終了している例です。

(メニュー操作後に、 配列全体を表示させています)



このプログラムを以下に示します。


このプログラムを文字列編集用のプログラムに 変更ください。
その時の実行例を、 このページ最後に示します。

(変数の名前などは変更せずに、 最小限の変更にしてください。)

Z:\java>java Test

a:追加、c:変更、e:終了>a
追加データ:  商品コード>>A01
  数量>>10
   0番目レコード
        商品コード:A01
        数量:10

a:追加、c:変更、e:終了>a
追加データ:  商品コード>>bbb
  数量>>0
   0番目レコード
        商品コード:A01
        数量:10
   1番目レコード
        商品コード:bbb
        数量:0

a:追加、c:変更、e:終了>a
追加データ:  商品コード>>C03
  数量>>30
   0番目レコード
        商品コード:A01
        数量:10
   1番目レコード
        商品コード:bbb
        数量:0
   2番目レコード
        商品コード:C03
        数量:30

a:追加、c:変更、e:終了>c
変更する添え字>1
変更データ:  商品コード>>C02
  数量>>20
   0番目レコード
        商品コード:A01
        数量:10
   1番目レコード
        商品コード:C02
        数量:20
   2番目レコード
        商品コード:C03
        数量:30

a:追加、c:変更、e:終了>e

Z:\java>

←正しく修正してからクリックください。

←わからない場合は、クリック

Z:\java>java Test

a:追加、c:変更、e:終了>a
追加データ:AAA
AAA

a:追加、c:変更、e:終了>a
追加データ:b
AAA
b

a:追加、c:変更、e:終了>a
追加データ:CC CCC
AAA
b
CC CCC

a:追加、c:変更、e:終了>c
変更する添え字>1
変更データ:BB
AAA
BB
CC CCC

a:追加、c:変更、e:終了>e

Z:\java>