Chap03 配列とベクターと結合配列の最近のブログ記事

(section03-02 配列の値を並べ替えるから抜粋)

 配列の値を逆順に並べ替えたいときは、reverse()を使います。

[:script:]配列の値を逆順にする
var vlist:Array=["青森","千葉","京都","宮崎"];
vlist.reverse();
trace(vlist);//出力:宮崎,京都,千葉,青森
(section03-01 Arrayクラスの配列から抜粋)

 配列の値の並びをストリング値にするには、toString()、join()のメソッドが利用できます。たとえば、["black","white","yellow"]というcolors配列があったときcolors.toString()は"black,white,yellow"という1つのストリングを作ります。toString()を実行しても元のcolors配列は変更されません。
 配列をストリングにする必要があるのは、配列の並びをテキストフィールドに表示するといった場合です。

[:script:]フィールドに配列の値を入れる
var colors:Array=["black","white","yellow"];
colors_fld.text=colors.toString();
fig03-01-01.jpg
 配列とストリングを連結するだけで、配列の値の並びは強制的にストリングに変換されます。元のcolors配列は変更されません。

[:script:]フィールドに配列の値を入れる
var colors:Array=["black","white","yellow"];
colors_fld.text="色は「"+colors+"」です。";
fig03-01-02.jpg
ストリングに変換する際に区切り文字を置換する
 join()は配列をストリングに変換する際に区切り文字を「,」ではなく指定の文字に置換します。次の例は区切りを「または」に置換しています。

[:script:]区切り文字を「または」に置換してストリングに変換する
var colors:Array=["黒","白","赤"];
var msg:String=colors.join("または");
trace(msg);//出力:黒または白または赤
 区切りを""にすれば、配列の値を1つのストリングに連結できます。

[:script:]区切り文字を取り除いたストリングに変換する
var colors:Array=["黒","白","赤"];
var msg:String=colors.join("");
trace(msg);//出力:黒白赤
(section03-01 Arrayクラスの配列から抜粋)

 配列の値を検索したい場合には、すべての値を総当たりでチェックしなければならない場合もありますが、単純に値が含まれているかどうかがわかればよい場合があります。そのような場合にはindexOf()、lastIndexOf()のメソッドが便利です。
 indexOf()は指定した検索開始位置から後ろへ検索して最初に見つかった位置を返します。検索開始位置を省略すると最初から探しします。開始位置をマイナスで指定すると後ろから位置を数えます。検索の結果見つからなかった場合には-1が返ってきます。

[:script:]配列を前から後ろへ検索する
var vlist:Array = new Array("a","x","b","a","x","c");
trace(vlist.indexOf("a",2));//出力:3
trace(vlist.indexOf("a",4));//出力:-1
//開始位置を省略
trace(vlist.indexOf("a"));//出力:0
//開始位置を後ろから数える
trace(vlist.indexOf("x",-3));//出力:4
補足:
2行目:"a"をインデックス番号2、つまり"b"の位置から後ろへ検索します。すると"b"の次の"a"が見つかります。この"a"はインデックス番号3なので3が返ります。
3行目:インデックス番号4の"x"の位置から"a"の検索を開始します。"x"より後ろに"a"はないので-1が返ります。
5行目:配列の先頭から"a"を検索します。先頭の"a"が見つかるので、インデックス番号0が返ります。
7行目:検索開始位置が-3なので、後ろから3個目の"a"から検索を開始します。検索方向は"a"から後ろ方向です。"a"の次の"x"が見つかります。この"x"のインデックス番号は4番です。

 lastIndexOf()は指定した検索開始位置から手前に検索して最初に見つかった位置を返します。検索開始位置を省略すると最後から探します。開始位置をマイナスで指定すると後ろから位置を数えます。検索の結果見つからなかった場合には-1が返ってきます。

[:script:]配列を後ろから前へ検索する
var vlist:Array=new Array("a","x","b","a","x","c");
trace(vlist.lastIndexOf("a",2));//出力:0
trace(vlist.lastIndexOf("a",4));//出力:3
//開始位置を省略
trace(vlist.lastIndexOf("a"));//出力:3
//開始位置を後ろから数える
trace(vlist.lastIndexOf("x",-3));//出力:1
補足:
後ろから検索しても、返ってくる値は前から数えるインデックス番号です。勘違いしやすいので注意してください。
2行目:インデックス番号2、つまり"b"の位置から前方向に"a"を検索します。先頭の"a"が見つかるので、インデックス番号0が返ります。
3行目:インデックス番号4、つまり後ろの"x"の位置から前方向へ"a"を検索します。すぐ左の"a"が見つかるので、インデックス番号3が返ります。
5行目:開始位置を省略すると最後から手前へ検索します。後ろの"a"が見つかるので、インデックス番号3が返ります。後ろから3個目ではなく、"a"のインデックス番号です。
7行目:後ろから3個目の"a"から前方向へ"x"を検索します。前から2個目の"x"が見つかるので、インデックス番号1が返ります。

 次のuniquePush()はnoListに同じ値が入っていなければ値を追加する関数です。引数で渡された値が配列に含まれていないかどうかをindexOf()で検索して確かめ、検索結果が-1のときに値をpush()しています。

[:script:]ユニークな値だけ配列に追加する
function uniquePush(tmplist:Array, v:int):void {
	//値が配列に含まれていないか検索する
	var index:int=tmplist.indexOf(v);
	if (index==-1) {
		//値を追加する
		tmplist.push(v);
	}
}
//配列に値を追加していく
var noList:Array=new Array(1,2,3);
uniquePush(noList,2);
uniquePush(noList,50);
uniquePush(noList,60);
uniquePush(noList,50);
trace(noList);//出力:1,2,3,50,60
(section03-01 Arrayクラスの配列から抜粋)

 concat()は複数の配列を連結して新しい配列を作るメソッドです。次の例は配列alist、blist、clistを連結して配列newlistを作っています。式を見た感じでは配列alistにblist、clistの値を追加する印象がありますが、この演算で配列alistの値は変化しません。concat()の引数は何個でもかまいません。

[:script:]配列を連結して新しい配列を作る
var alist:Array=new Array("a","b","c");
var blist:Array=new Array("m","n");
var clist:Array=new Array("x","y","z");
var newlist:Array=alist.concat(blist,clist);
trace(newlist);//出力:a,b,c,m,n,x,y,z
(section03-01 Arrayクラスの配列から抜粋)

 配列は数値やストリングなどと違ってオブジェクトなので、配列を変数に代入するとリファレンス型の変数になります。たとえば、配列の入った変数alistを変数blistに代入したとき、どちらも同じ配列を参照しています。配列alist、blistに対して値の追加などの操作を行ったとき、片方の配列に操作した内容が両方に影響してしまいます。

[:script:]配列を複製したつもりでも同じ配列を参照している
var alist:Array=[1,2,3];
//blistにalistを代入する
var blist:Array=alist;
alist.push("x");//alistに"x"を追加
blist.push("y");//blistに"y"を追加
//どちらも同じ値になっている
trace(alist);//出力:1,2,3,x,y
trace(blist);//出力:1,2,3,x,y
 配列を複製したい場合にはslice()が利用できます。slice()の引数を省略するとslice(0)を実行した場合と同じになり、配列のすべての値を複製した新しい配列を作ることができます。

[:script:]配列を複製する
var alist:Array=[1,2,3];
//blistにalistを複製して代入する
var blist:Array=alist.slice();
alist.push("x");//alistに"x"を追加
blist.push("y");//blistに"y"を追加
//alistとblistは個別の配列になっている
trace(alist);//出力:1,2,3,x
trace(blist);//出力:1,2,3,y
(section03-01 Arrayクラスの配列から抜粋)

 配列の一部を取り出すメソッドにはslice()とsplice()があります。どちらも取り出した値の配列を作ります。slice()では元の配列は変化しないのに対し、splice()の場合は抜き取った値が元の配列から取り除かれるという違いがあります。
 次の例はslice()を使って新しい配列を作り出しています。取り出す位置はslice(startIndex,endIndex)のように指定します。このとき、slice(1,4)ならば1〜3番目を取り出し、4番目を含まないので注意が必要です。
 次の例では配列allListから1〜3番目の値を複製して新しい配列selectListを作成します。配列のインデックスは0からカウントするので、1〜3番目は"b"、"c"、"d"になります。slice()で値を取り出しても元の配列allListの中身はそのままで変化していません。

[:script:]配列の1〜3番目の値を取り出す
var allList:Array=["a","b","c","d","e","f"];
var selectList:Array=allList.slice(1,4);
//取り出した配列
trace(selectList);//出力:b,c,d
//元の配列は変化しない
trace(allList);//出力:a,b,c,d,e,f
 slice()は2番目の引数を省略できます。slice(3)のように引数を1つだけ指定した場合は3番目(並びでは4個目)から最後までの値を指定したことになります。

[:script:]配列の3番目から最後までの値を取り出す
var allList:Array=["a","b","c","d","e","f"];
var selectList:Array=allList.slice(3);
trace(selectList);//出力:d,e,f
trace(allList);//出力:a,b,c,d,e,f
 引数をマイナスにすると末尾から個数を数えて取り出します。次の例は末尾から4個の値を取り出した配列を作ります。インデックス番号と違って1から数えるので注意してください。

[:script:]配列の後ろから4個の値を取り出す
var allList:Array=["a","b","c","d","e","f"];
var selectList:Array=allList.slice(-4);
trace(selectList);//出力:c,d,e,f
trace(allList);//出力:a,b,c,d,e,f

*初版ではsplice()の項に間違いがあります。訂正原稿を参照してください。
(section03-01 Arrayクラスの配列から抜粋)

 push()が配列の最後に値を追加するメソッドなのに対し、unshift()は配列の先頭に値を挿入し、挿入後の配列の長さを返すメソッドです。同時に複数の値を挿入することもできます。
 次の例は最初に["red","yellow"]のcolors配列を作り、色を先頭に挿入しています。挿入結果の値の並び順に注目してください。

[:script:]配列の先頭に値を挿入する
var colors:Array=new Array("red","yellow");
//値を先頭に挿入する
colors.unshift("black");
var cnt:uint=colors.unshift("white","gray");
trace(cnt);//出力:5
trace(colors);//出力:white,gray,black,red,yellow
 逆にshift()は配列の先頭の値を抜き取るメソッドです。shift()で値を抜き取ると先頭の値が配列から削除されます。
 次の例はcolorsから先頭の色を抜き取っています。firstColorには先頭の値の"red"が入り、元のcolorsからは先頭の値が削除されて["yellow","black"]の2色になります。

[:script:]配列の先頭の値を抜き取る
var colors:Array = new Array("red", "yellow", "black");
var firstColor:String = colors.shift();
//取り出した値
trace(firstColor);//出力:red
//元の配列からは先頭の値が取り除かれている
trace(colors);//出力:yellow,black
(section03-01 Arrayクラスの配列から抜粋)

 Arrayクラスには、配列に値を追加挿入したり、値を抜き取るといったメソッドがあります。push()は配列の最後に値を追加し、追加後の配列の長さを返すメソッドです。同時に複数の値を追加することもできます。
 次の例は最初に空のcolors配列を作り、色を末尾に追加しています。結果として["red","yellow","green","black"]の配列になります。

[:script:]配列に値を追加する
//空の配列を作る
var colors:Array = new Array();
//値を追加する
colors.push("red");
colors.push("yellow","green");
//pushした順に値が追加されている
trace(colors);//出力:red,yellow,green

var cnt:uint=colors.push("black");
//pushすると配列の長さが返ってくる
trace(cnt);//出力:4
trace(colors);//出力:red,yellow,green,black
 逆にpop()は配列の最後の値を抜き取るメソッドです。演算子[]で最後の値を取り出しても元の配列に入っている値はそのままですが、pop()で値を抜き取ると最後の値が配列から削除されます。
 次の例はcolorsから最後の色を抜き取っています。lastColorには最後の値の"black"が入り、元のcolorsからは最後の値が削除されて["red","yellow"]の2色になります。

[:script:]配列の最後の値を抜き取る
var colors:Array=["red","yellow","black"];
var lastColor:String=colors.pop();
//取り出した値
trace(lastColor);//出力:black
//元の配列からは最後の値が取り除かれている
trace(colors);//出力:red,yellow
(section03-01 Arrayクラスの配列から抜粋)

 配列の長さ、すなわちエレメント(値)の個数はlengthプロパティで調べます。配列のインデックス番号は0からカウントしますが、lengthは1から数えます。

[:script:]配列の値の個数を調べる
var colors:Array=["red","green","yellow"];
var weekj:Array=new Array("日","月","火","水","木","金","土");
trace(colors.length);//出力:3
trace(weekj.length);//出力:7
 lengthは読み出しだけでなく値の設定も可能です。lengthを設定すると配列がその長さに変更されます。配列の長さよりも大きな値を設定するとundefinedが追加され、小さな値を設定すると長さに合わせてエレメントが後ろから削除されます。

[:script:]配列の長さを指定する
var colors:Array=["red","green","yellow","black"];
//配列より長いlengthを指定する
colors.length=8;
trace(colors);//出力:red,green,yellow,black,,,,
//配列より短いlengthを指定する
colors.length=3;
trace(colors);//出力:red,green,yellow
note 配列の長さを固定したい場合はVectorクラスを利用します。→ベクターのエレメントの個数を制限する

 次の例は配列からランダムに値を選ぶスクリプトです。randomValue()の2行目で配列の値の個数を元にランダムなインデックス番号を作り、3行目でリストから値を取り出します。

[:script:]配列からランダムに値を選ぶ
function randomValue(list:Array):String {
	var index:uint = Math.floor(Math.random() * list.length);
	var v:String = list[index];
	return v;
}

var colors:Array = ["red","green","blue","pink","black"];
//配列colorsから1色選ぶ
var color:String = randomValue(colors);
trace(color);
(section03-01 Arrayクラスの配列から抜粋)

 これまでの例では配列を演算子[]で作りましたが、配列のデータ型はArrayクラスであり、new演算子を使ってArrayクラスのインスタンスとして作ることができます。

[:script:]Arrayクラスのインスタンスとして配列を作る
var colors:Array=new Array("red","green","yellow");
var weekj:Array=new Array("日","月","火","水","木","金","土");
var vlist:Array=new Array(2900,"XA","white");
 new Array()で配列を作る場合、通常は引数で指定した値がそのまま配列のエレメント(要素)の値になりますが、引数が整数1個の場合は引数で指定した個数の配列が作られます。配列のエレメントの値は空(undefined)です。たとえば、次のスクリプトの4行目ではnew Array(5)で[5]ではなく[,,,,]が作られます。

[:script:]Array()の引数が整数1個のときに結果が違う
var vlist1:Array=new Array();//空の配列[]
var vlist2:Array=new Array("red");//配列["red"]
var vlist3:Array=new Array(5,3);//配列[5,3]
var vlist4:Array=new Array(5);//配列[,,,,]
まったく新しいAS3の世界!
694a.jpg
Adobe Flash CS4
詳細!ActionScript3.0入門ノート[完全改訂版](CD-ROM付)

楽しいActionScript。
新たなる1歩へと踏み出しましょう。
■内容は?→ 目次を見る
■評判は?→ 書評を読む
この本を書いたわけ

このアーカイブについて

このページには、過去に書かれたブログ記事のうちChap03 配列とベクターと結合配列カテゴリに属しているものが含まれています。

前のカテゴリはChap01 プログラミングの基礎知識です。

次のカテゴリはChap04 イベント処理の基礎です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

あわせて読みたいブログパーツ