◆PROCESSING 逆引きリファレンス
カテゴリー:プログラミング
【解説】
プログラミングをしていると、どの言語であっても大抵の場合は配列変数を扱う機会があります。
配列変数の基礎については「配列変数を利用するには(基礎編)」で触れました。簡単に言えば、「同じ型(どのような値を扱うのかが同じタイプ)の変数を、同じ名前でひとまとめにして、変数に連番(添字)を付けて扱えるようにしたもの」です。
そんな便利な配列変数ですが、単純な配列変数では少しばかり使いにくい事があります。え、どんな場合だって?・・・。例えば以下の様な「野菜」を格納する配列変数を考えてみましょう(笑)。
配列変数に順番に野菜を3つ格納してあります。この中から1番目の箱に入っているナスが売れたとします。そこで、その後ろにある2番目の箱の中身(キュウリ)を前詰めし、空き箱となる2番目の箱を廃棄したくなったら、どうしたら良いでしょうか?。
1) 1番の箱から「ナス」を取り出す。
2) 2番の箱から「キュウリ」を取り出す。
3) 取り出した「キュウリ」を1番の箱に入れる。
4) 2番は空き箱になったので、箱ごと始末する。
たとえば、こんな作業になりそうです。
1 2 3 4 5 6 7 8 |
//箱を用意して野菜を詰めます String[] ybox = {"トマト","ナス","キュウリ"}; String hozon; //ここからが本題 hozon = ybox[1]; //hozonにナスを取り出します① ybox[1] = ybox[2]; //キュウリを取り出してナスの箱に入れます② ybox = shorten( ybox ); //最後の箱(元々キュウリが入っていた箱)を廃棄します③ |
プログラムで書くと上記のようになります。
箱が3つしかない場合は良いのですが、色々な野菜が100も200も入った箱があったとしたら、どうでしょうか?。②の作業をグルグルと配列の要素数分だけ何度も行わないといけない事が想像できると思います。
このように、単純な配列では「配列の途中にデータを追加」したり、「配列の途中からデータを抜き出して前詰め」したい場合、すべてプログラマー側で頑張らないといけません。
また、そもそも格納したい値(野菜)が前もって幾つあるのか良くわからない場合も、単純な配列変数では困ります。
ArrayListを使うと、これらの問題が簡単に解決できます。
【構文】
●宣言:
ArrayList<Type> 変数名;
●確保:
変数名 = new ArrayList<Type>();
宣言、確保時において<Type>は省略する事も可能です。
【主なメソッド】
●値を追加する(戻り値:boolean)
add( element );
add( index, element );
●値を置き換える(戻り値:element)
set(index, element)
●値を削除する(戻り値:boolean)
remove( index );
●値を全て消去する(戻り値:void)
clear();
●値を取得する(戻り値:element)
get( index );
●値の格納場所を得る(戻り値:int)
indexOf( element );
●値がいくつあるか知る(戻り値:int)
size();
【注意】
宣言時に<Type>を省略した場合、基本的にはどんな型の値でもArrayListで管理可能となります。<Type>を指定した場合は、指定された型の変数のみが扱えるようになります。
宣言と確保時において、指定した<Type>が異なる場合はエラーとなります。
<Type>には、通常Composite(コンポジット)型名か、オブジェクト名(クラス名)のみが指定可能です。intやlongなどのPrimitive(プリミティブ)型名は指定できません。ArrayListで管理する値をintやlongなどのPrimitive(プリミティブ)型に制限したい場合は、<Type>を省略するか、<Type>にintやlongのラッパークラス名を指定します。
例:
ArrayList<Integer> al1;
ArrayList<Double> al2;
●値を追加する場合
add( element ); でArrayListの一番後ろに値( element )を追加します。
add( index, element ); で、index番目に値( element )が挿入可能です。ただしindexは0から始まる値で、ArrayListに格納済みのelement数までしか指定できません。たとえば1つだけしか値を格納していないArrayListに対し、add( 2, element ); と指定するとエラーになります。値の追加が成功すると true が、失敗すると false が戻されます。
●値を置き換える場合
set(index, element); で指定したindex番目の値を elementに置き換えます。indexは0から始まる値で、ArrayListに格納済みのelement数-1までしか指定できません。たとえば1つだけしか値を格納していないArrayListに対し、set( 1, element ); と指定するとエラーになります。戻り値には、置き換える前に該当位置に格納されていた element が戻ります。
●値を削除する場合
remove( index ); でindex番目に格納されている値を削除し、後続の値を自動で前詰めしてくれます。indexは0から始まる値で、ArrayListに格納済みのelement数-1までしか指定できません。たとえば1つだけしか値を格納していないArrayListに対し、remove( 1 ); と指定するとエラーになります。
●値を消去する場合
clear();で、該当ArrayListに格納されている値を全て廃棄し、0個にします。エリアを確保していない ArrayList は消去できません。
●値を取得する場合
get( index ); でindex番目に格納されている値を読み出します。indexは0から始まる値で、ArrayListに格納済みのelement数-1までしか指定できません。たとえば1つだけしか値を格納していないArrayListに対し、get( 1 ); と指定するとエラーになります。getに成功すると、指定位置のelementが戻されますが、これはArrayListに格納されているindex番目の値を複写したものになります。元のArrayList内から値が無くなってしまうわけではありません。
●値の格納場所を得る場合
indexOf( element ); にて、ArrayListの中から element と一致した最初の値の位置を取得します。指定された element が見つからない場合、-1 が戻されます。エリアを確保していない ArrayList は探索できません。
●値がいくつあるか知る場合
size();は、ArrayListに値がいくつ格納されているかを取得します。1個しか値が格納されていない場合は1が戻ります。エリアを確保していない ArrayList の個数は取得できません。
【関連記事】
●配列変数を利用するには(基礎編)
●配列変数を利用するには(応用編)
●配列変数を利用するには(StringList編)
●値を追加する例:
1 2 3 4 5 6 |
ArrayList al; //宣言 al = new ArrayList(); //確保 al.add( 100 ); //1つ目を追加 al.add( 0, 200 ); //1つ目の値の前に挿入 println( al ); //表示する |
add( element ); で0番目に1つ目の値(100)を追加します。その後で、add( index, element ); を利用して、0番目に2つ目の値(200)を追加(挿入)しています。結果的に、最初に追加した値が後ろにズレて、200、100の順番となります。
<出力サンプル>
●値を置き換える例:
1 2 3 4 5 6 7 8 9 10 11 |
ArrayList<String> al; //宣言 al = new ArrayList<String>(); //確保 String s; al.add( "かき" ); //1つ目を追加 al.add( "さば" ); //2つ目を追加 al.add( "もも" ); //3つ目を追加 s = al.set( 1, "りんご" ); //"さば"を置き換える println( s ); //元の値を表示する println( al ); //alの中身を表示する |
フルーツの名前を3つ追加する予定が、2番目に魚の名前(さば)を追加してしまったとしましょう・・・(笑)。set()で、2番目に追加した値を ”りんご” に置き換えています。
set()の戻り値には、元々2番目に格納されていた値(さば)が戻されます。
<出力サンプル>
●値を削除する例:
1 2 3 4 5 6 7 8 9 10 11 |
ArrayList<String> al; //宣言 al = new ArrayList<String>(); //確保 String s; al.add( "かき" ); //1つ目を追加 al.add( "なし" ); //2つ目を追加 al.add( "もも" ); //3つ目を追加 s = al.remove( 1 ); //"なし"を削除 println( s ); //元の値を表示する println( al ); //alの中身を表示する |
フルーツの名前が3つ格納されているArrayListから、真ん中の “なし” を削除します。remove()の戻り値には、削除された値(なし)が戻ります。
<出力サンプル>
●値を全て消去する例:
1 2 3 4 5 6 7 8 9 10 |
ArrayList<String> al; //宣言 al = new ArrayList<String>(); //確保 al.add( "かき" ); //1つ目を追加 al.add( "なし" ); //2つ目を追加 al.add( "もも" ); //3つ目を追加 println( al ); //alの中身を表示する al.clear(); //alの中身を消去する println( al ); //alの中身を表示する |
いくつかの値が格納されている ArrayList の中身を全て消去します。結果、ArrayListは空っぽ(0個の項目)になります。
<出力サンプル>
●値を取得する例:
1 2 3 4 5 6 7 8 9 |
ArrayList<String> al; //宣言 al = new ArrayList<String>(); //確保 al.add( "かき" ); //1つ目を追加 al.add( "なし" ); //2つ目を追加 al.add( "もも" ); //3つ目を追加 println( al.get(2) ); //3つ目を取得して表示 println( al ); //ArrayListの状態表示 |
フルーツの名前が3つ格納されているArrayListから、最後の項目(もも)を取得して表示しています。get()は値のコピーを取得するので、元のArrayListは変化しない事に注目してください。
<出力サンプル>
●値の格納場所を得る例:
1 2 3 4 5 6 7 8 9 10 11 12 |
ArrayList<String> al; //宣言 al = new ArrayList<String>(); //確保 al.add( "かき" ); //1つ目を追加 al.add( "なし" ); //2つ目を追加 al.add( "もも" ); //3つ目を追加 al.add( "なし" ); //4つ目を追加 //[なし]の最初の格納位置を取得 println( al.indexOf("なし")); //存在しない値を見つけようとした場合 = -1 println( al.indexOf("ぶどう")); |
フルーツの名前が4つ格納されているArrayListから、”なし” に一致する値の格納場所を探して表示しています。
本例では “なし” は2番目と4番目に格納されています。このような場合は、最初に見つけた位置(0から始まる配列なので1)が戻されます。
”ぶどう” のように、ArrayListの中に存在しない値を探させた場合は、-1 が戻ります。
●値がいくつあるか知る例:
1 2 3 4 5 6 7 8 9 |
ArrayList<String> al; //宣言 al = new ArrayList<String>(); //確保 al.add( "かき" ); //1つ目を追加 al.add( "なし" ); //2つ目を追加 al.add( "もも" ); //3つ目を追加 //値の格納個数を表示 println( al.size() ); |
フルーツの名前が3つ格納されているArrayListがあります。このArrayListに値がいくつ格納されているか知るにはsize()を用います。
<出力サンプル>
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。