サイトトップ

Director Flash 書籍 業務内容 プロフィール

Adobe Flash非公式テクニカルノート

エレメントをもったVectorインスタンスの生成

ID: FN1006002 Product: Flash CS4 and above Platform: All Version: 10 and above/ActionScript 3.0

Flash Player 10から備わったVectorクラスは、予め定めた同じデータ型の値を連番インデックスのエレメントに収めます。いわば最適化されたArrayクラスといえます。ただし、Arrayクラスと異なり、Vector()コンストラクタメソッドに引数としてエレメントの初期値を渡すことはできません。そこで、Vectorインスタンスに初期値のエレメントを加える手法についてご説明します。


01 Vector()関数で配列を変換する
書き方として簡単なのは、グローバル関数Vector()で配列をVectorインスタンスに変換することです。配列はリテラルで書けば、見た目もわかりやすくなります。

var Vectorインスタンス:Vector.<ベース型> = Vector.<ベース型>(Arrayインスタンス);

Vector()関数は、引数に渡された配列のエレメントひとつひとつをベース型に変換します。

var myVector:Vector.<int> = Vector.<int>([0.9, true, "2", [3]]);
trace(myVector);   // 出力: 0,1,2,3

もっとも、Vectorクラスを使うときは、エレメントのデータ型(ベース型)は正しく揃えるのが普通です。その場合、いちいちデータを変換する必要はないのに、余計な処理(時間)が増えることになります。


02 Vector.push()メソッドでエレメントを加える
Vectorインスタンスにエレメントを加えるメソッドとしてもっとも用いられるのはVector.push()でしょう。コンストラクタでインスタンスをつくったあと、Vector.push()メソッドで初期値が納められます。

var Vectorインスタンス:Vector.<ベース型> = new Vector.<ベース型>();
Vectorインスタンス.push(値);

エレメントはひとつひとつ加えると、インデックスと値がわかりやすくなります。

var myVector:Vector.<int> = new Vector.<int>();
myVector.push(0);
myVector.push(1);
myVector.push(2);
myVector.push(3);
trace(myVector);   // 出力: 0,1,2,3

Vector.push()メソッドの引数には、複数の値をエレメントとして渡すこともできます。値を納める処理としては、こちらの方が速いようです。

var myVector:Vector.<int> = new Vector.<int>();
myVector.push(0, 1, 2, 3);
trace(myVector);   // 出力: 0,1,2,3

03 配列アクセス演算子でエレメントを加える
配列アクセス演算子[]でVectorインスタンスに値を加えることもできます。ただし、Vectorエレメントは、必ずインデックスが連番でなければなりません。インスタンスの長さ、つまりVector.lengthプロパティの値より大きいインデックスを指定しないように注意しましょう。

var Vectorインスタンス:Vector.<ベース型> = new Vector.<ベース型>();
Vectorインスタンス[インデックス] = 値;

Vector.push()メソッドと比べて、インデックスが明らかにできます(逆に、Vector.push()メソッドは、連番を気にしなくて済みます)。また、処理も少し速くなります。

var myVector:Vector.<int> = new Vector.<int>();
myVector[0] = 0;
myVector[1] = 1;
myVector[2] = 2;
myVector[3] = 3;
trace(myVector);   // 出力: 0,1,2,3

加えるエレメント数が予め決まっているときは、コンストラクタに第1引数としてその数を渡した方が処理は速いです。

var myVector:Vector.<int> = new Vector.<int>(4);   // 長さを指定
myVector[0] = 0;
myVector[1] = 1;
myVector[2] = 2;
myVector[3] = 3;
trace(myVector);   // 出力: 0,1,2,3

04 新しいnewシンタックスを使う
Flash Professional CS5から、new演算子による新しいシンタックスで、予めエレメントを納めたVectorインスタンスがつくれるようになりました[*1]。クラス名のVectorも書かない、少し変わった書式です。

var Vectorインスタンス:Vector.<ベース型> = new <ベース型>[エレメント0, エレメント1, …, エレメントN];

プリミティブ値などの単純な値をエレメントに加える場合には、手っとり早くてしかも見やすい書き方といえます。内部的には、長さを定めたインスタンスに配列アクセス演算子で値を納める処理と、基本的に変わらないようです[*2]。処理の速さもほとんど差がありません。

var myVector:Vector.<int> = new <int>[0, 1, 2, 3];

[*1] コンパイル(SWFファイルの書出し)には、Flash Professional CS5以降が必要です。しかし、このシンタックスで書いたスクリプトは、Flash Player 10.0でも動きます。

[*2] JacksonDunstan.com「Declaring Vectors」が、各手法のバイトコードを示して比べています。


05 それぞれの手法の速さについて
大量のVectorインスタンスを一気につくり出すということはあまりないでしょう。したがって、処理の速さばかりに気をとられず、上述の得失を知ったうえで、適切な手法を選べばよいと考えます。

ただ、配列アクセス演算子によりインデックスに値を納める場合は、インスタンス生成時にその長さを定めておくべきでしょう。また、単純な値をまとめて加えるとき、Flash Professional CS5からは新しいnewシンタックスが見やすく、また処理も速いといえます[*3]

[*3] ご参考までに、以下は速さを比べるためのテスト用クラスの結果です。長さの決まったインスタンスに配列アクセス演算子で値を加えるのがもっとも速く、Vector.push()メソッドに複数のエレメントを渡す方法と新たなnewシンタックスがそれに続きます。Vector()関数で配列を変換(キャスト)する処理がもっとも遅くなりました。


作成者: 野中文雄
作成日: 2010年6月19日


Copyright © 2001-2010 Fumio Nonaka.  All rights reserved.