Archive for the ‘Array’ Category
Arrayからデータを消すには、ちょっと癖がある。
とくに、shiftやpopなどのように先頭や最後からデータを消そうとすると、
ちょっとプログラムをしている手がとまる。
ということで、覚書のために載せておく。
これ以外にも方法はあるとは思います。
1.指定したオブジェクトのデータを削除する
// 削除したいオブジェクトの場所を見つける var index:int = mx.utils.ArrayUtil.getItemIndex(findMe,arrayObject); // その場所から1つのオブジェクトを消す arrayObject.splice(index,1);
2.すべてのデータを削除する
arrayObject.length = 0;
lengthを0にすればすべてのデータを削除できるなんて、
メモ : length プロパティに既存の長さよりも短い値を割り当てた場合、配列は切り詰められます。
なんてメモからは思い浮かびませんよね。
ArrayとArrayCollectionの違いについて、やっと腑に落ちたような気がした。
いろいろと書いてあり、マニュアルには
「ArrayCollection クラスは、ICollectionView または IList インターフェイスのメソッドとプロパティを使用して、アクセスおよび操作できるコレクションとして配列を公開するラッパークラスです。 ArrayCollection インスタンスに対する操作はデータソースを変更します。たとえば、ArrayCollection で removeItemAt() メソッドを使用した場合、元になる Array からアイテムが削除されます。 」
と書いてある。
この文面を見ても、理解できないところなどない。
でも、いまひとつ「なーるほど」と言えるほど、理解できない。
でも、前回 ICollectionViewを自作してみてわかった。
DataGridやTreeで表示する際には、表示されている部分だけを管理する必要性や、また、アクセスする方法も多々必要になる。
たとえば、GUIがなければremoveItemAtなどあまり必要がないメソッドだろう。
でも、DataGridで表示していれば、当然、選択した1行を削除などが必要になる。
このような操作ができるインターフェースが ICollecitonViewだ。
このようなデータモデルとして利用するときに、配列を扱えるようにしたものが、ArrayCollectionだと。
要するに、配列データをGUIと結ぶ上で必要な処理をするクラスという事です。
(もちろん、GUIと結ばなくても、イベント処理だけを使うなどもできますが・・・、それはICollecitonViewとは関係ありません。)
と、この説明を聞いていもよくわからないと思いますが、これらの関係がわかればFlexのデータモデルをかなり理解できたことになるのではないでしょうか?ぜひ、ソースを見てみることをお勧めします。
(といっても、まだ、IViewCursorとの関係がよく理解できていません。)
AdvancedDataGridが使えないフリーの方や、スタンダードの場合にはこのモデルしかつかわないともいえるので・・・
Arrayオブジェクトのコピーをしようとするときに、Array.copy() とかって感じのメソッドがあるかと思ったら,
[ないので、中に納めているデータが小さければ単純にfor文でまわしてコピーしてしまっていた。
そしたら、
array.concat();
のように引数なしで呼べばいいですね。
array.splice()
も同様にできるようですが、ちょっとこれは、トリッキーすぎますよね。
ソースを見ても、何がいいたいのか?わからないですよね。
まあ、concatは言われてみれば、指定された配列をマージして新しい配列で返すというようなことが書いてあるので・・・・。
これ、ArrayListというArrayCollectionのソースを見ていたら、なんでこんなことをするのかな?とちょっと目にとまったので気がつきました
そしたら、ちゃんとマニュアル(ヘルプ)にも、「配列のクローンの作成」っていう題で記述があるじゃないですか・・・。
でも、書くまでそこで「んっ」って思う事がわかっているのならば、ぜひとも、その前に用意しておいてほしいですよね。
別にメソッドのalias でもいいですから。
前回の続きで、可変関数を利用して複数の配列をマージするユーティリティクラスを作ろうとおもったら、すでにありました。
下に、マニュアルに載っていたサンプルをもとに、引数を複数にして試してみました。
詳しくはマニュアルを見てください。
var numbers:Array = new Array(1, 2, 3);
var letters:Array = new Array("a", "b", "c");
var numbersAndLetters:Array = numbers.concat(letters,"A","B","C");
var obj:Object = new Object();
var lettersAndNumbers:Array = letters.concat(numbers,obj);
trace(numbers); // 1,2,3
trace(letters); // a,b,c
trace(numbersAndLetters); // 1,2,3,a,b,c,A,B,C,D
trace(lettersAndNumbers); // a,b,c,1,2,3,[object Object]]
trace(letters); // a,b,c

