Hatena::ブログ(Diary)

yumicroの日記 RSSフィード

2009-07-19

ArrayとArrayCollectionの違い

02:11

最近は会社である課題を出され、それを特に時間制限もなく

プログラムの理解を深めるために勉強させて頂いております!


なかなか難しい課題を出されるのですが、ネット上には答え

が色々と転がっているもので・・・。それをコピペしていると

なんとなく出来てしまったりします。


それも有難いのですが。

やっぱり、理解するために頂いている時間なので、

それでは意味が無いし、今後の自分のためにもよろしくない

ということで。


今回は、会社の課題で疑問に思ったFlexのArrayとArrayCollection

の違いについて調べてみました(*^_^*)v

javaではArrayやArrayListなどが配列を扱うクラスとして利用することができました。

Flexで用いるActionScriptという言語では、ArrayとArrayCollectionというクラスが

あります!なので、javaの時と混同してしまい、頭が混乱気味です。。。


まず、下のソースの通り、書き方としては、全く2つの間に違いは見られません・・・。


【Arrayの場合】


var ArrayData:Array = new Array();

ArrayData = [{data1:"花子",data2:"21才"},{data1:"二郎",data2:"18才"}];


【ArrayCollectionの場合】


var ArrayData:ArrayCollection = new ArrayCollection();

ArrayData = [{data1:"花子",data2:"21才"},{data1:"二郎",data2:"18才"}];


何が違うんでしょ?


調べてみると・・・。

ArrayCollection クラスは,ICollectionView または IList インタフェースのメソッドとプロパティを使用して,アクセスおよび操作できるコレクションとして配列を公開するラッパークラスです。

という説明が。。。

私には言っていることが難しいですし、よく理解できませんでした(>_<)


もっと調べてみると!

ArrayCollectionは、Arrayを内包する

ArrayCollectionは、内包したArrayをいじること無く、ソートをしたりできる

ArrayCollectionは、内包したArrayのView

ArrayCollectionは、bindableなども利用できる(?)

参考サイトhttp://actionscript.g.hatena.ne.jp/d4-1977/?of=40


これなら少しわかります!

そして、さらに・・・



【Array】

*データ保存のために使用する

*dataProviderとしては使用できない

*一度はバインドできるがデータ操作ができないため、データを入れ替えても画面に反映されない


【ArrayCollection】

*dataProviderとして使用する

*データ操作を行うことができるので、データが変更されるとそれが画面に反映される

参考サイトhttp://www.necst.co.jp/product/ibiz/column/flex/chap4_3.html




どうやら、ArrayよりもArrayCollectionは便利なようです。


具体的にどんなことが便利だというと。


私が理解できたのは、

ArrayCollectionの方がArrayよりも多くのメソッドを持っている!


例えば、すでに配列の中身を作っていた場合、

Arrayでは元のデータを書き換えるしかないですが、

ArrayCollectionでは、以下のメソッドを使えば好きな時に追加する事ができたり、好きなデータ

を取得出来たりします。


//指定されたアイテムをリストの末尾に追加する。
addItem(item:Object):void

//指定されたインデックス位置にアイテムを配置する。
setItemAt(item:Object, index:int):Object

//指定されたインデックス位置にあるアイテムを取得する。
getItemAt(index:int, prefetch:int = 0):Object





また、DataGridという、HTMLではTableと同じ様な機能を持つMXMLのタグがあります。

これは、使いたいデータを指定する時には以下の様に、dataProviderというものを

使用します。


<mx:DataGrid dataProvider="{ArrayData"}>






でもdataProviderを使う際には、Arrayで作ったデータを指定することはできません。

ArrayCollecitonで作ったデータなら使うことができます。

実際の使い方の違いを見てみると・・・


【 Array配列を使用した例 】

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="initData()">

<mx:Script>

import mx.collections.ArrayCollection;

private var DataGridArray:Array = [

{Data1:"1-1.Data", Data2:1.05},

{Data1:"2-1.Data", Data2:2.05}];

[Bindable]

public var initGridData:ArrayCollection;

public function initData():void {

initGridData=new ArrayCollection(DataGridArray);

}

>

</mx:Script>

<mx:DataGrid dataProvider="{initGridData}" >

<mx:columns>

<mx:DataGridColumn dataField="Data1" />

<mx:DataGridColumn dataField="Data2" />

</mx:columns>

</mx:DataGrid>

</mx:Application>





【 ArrayCollection配列を使用した例 】

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

<mx:Script>

import mx.collections.ArrayCollection;

[Bindable]

public var initGridData:ArrayCollection = new ArrayCollection([

{Data1:"1-1.Data", Data2:1.05},

{Data1:"2-1.Data", Data2:2.05}]);

>

</mx:Script>

<mx:DataGrid dataProvider="{initGridData}" >

<mx:columns>

<mx:DataGridColumn dataField="Data1" />

<mx:DataGridColumn dataField="Data2" />

</mx:columns>

</mx:DataGrid>

</mx:Application>

参考サイトhttp://air-flex.jugem.jp/?eid=31



このように、ArrayのデータをdataProviderで指定したい時は、

Arrayで作ったデータをArrayCollectionにキャストしています。

こうすることで、dataProviderにArrayのデータを指定すること

ができるようです。



他にも色々利点があるようですが、

今回はこの辺で♪

imai78imai78 2009/07/23 23:54 僕はコピペではなく書き写す(俗にいう「写経」)をするようにしてます。
書き写せばものぐさな自分でも隅から隅まで見るだろう、という奴ですね。

・・・今回のエントリで、僕も少しFlexを分かったような気になれました!
ありがとうございます。

hodoshimahodoshima 2009/07/25 20:55 imai78さん>
私もコピペはあまり良くないかなぁとは思ったのですが・・・やっぱり自分で手を動かした方がいいですよね(>_<)
Flexわかってしまった感じですか!!なかなかかっこいいものですよ♪有償ですが、90日間だけでも試してみてはいかがでしょうか(^^)v

トラックバック - http://d.hatena.ne.jp/hodoshima/20090719/1248023508
Connection: close