as3,Dictionary,關聯陣列

來源:互聯網
上載者:User

 

關聯陣列

關聯陣列有時候也稱為“雜湊”或“映射”,
它使用“鍵”而非數字索引來組織儲存的值。關聯陣列中的每個鍵都是用於訪問一個儲存值的唯一字串。關聯陣列為 Object
類的執行個體,也就是說每個鍵都與一個屬性名稱對應。關聯陣列是鍵和值對的無序集合。在代碼中,不應期望關聯陣列的鍵按特定的順序排列。

ActionScript 3.0 中引入了名為“字典”的進階關聯陣列。字典是 flash.utils 包中 Dictionary 類的執行個體,使用的鍵可以為任意資料類型,但通常為 Object 類的執行個體。換言之,字典的鍵不局限於 String 類型的值。

本部分說明如何建立使用字串作為鍵的數組以及如何使用 Dictionary 類。


子主題
具有字串鍵的關聯陣列
具有對象鍵的關聯陣列

具有字串鍵的關聯陣列

在 ActionScript 3.0
中有兩種建立關聯陣列的方法。第一種方法是使用 Object 建構函式,它的優點是可以使用對象文本初始化數組。Object
類的執行個體(也稱作“通用對象”)在功能上等同於關聯陣列。通用對象的每個屬性名稱都用作鍵,提供對儲存的值的訪問。

以下樣本建立一個名為 monitorInfo
 的關聯陣列,並使用對象文本初始化具有兩個鍵和值對的數組:

var monitorInfo:Object = {type:"Flat Panel", resolution:"1600 x 1200"};
trace(monitorInfo["type"], monitorInfo["resolution"]);

如果在聲明數組時不需要初始化,可以使用 Object 建構函式建立數組,如下所示:



var monitorInfo:Object = new Object();

使用對象文本或 Object 類建構函式建立數組後,可以使用括弧運算子 ([]
) 或點運算子 (.
) 在數組中添加值。以下樣本將兩個新值添加到 monitorArray
 中:

monitorInfo["aspect ratio"] = "16:10"; // 格式錯誤,請勿使用空格
monitorInfo.colors = "16.7 million";
trace(monitorInfo["aspect ratio"], monitorInfo.colors);
// 輸出:16:10 16.7 million

請注意,名為 aspect ratio
 的鍵包含空白字元。也就是說,空白字元可以與括弧運算子一起使用,但試圖與點運算子一起使用時會產生一個錯誤。不建議在鍵名稱中使用空格。

第二種關聯陣列建立方法是使用 Array 建構函式,然後使用括弧運算子 ([]
) 或點運算子 (.
) 將鍵和值對添加到數組中。如果將關聯陣列聲明為 Array 類型,則將無法使用對象文本初始化該數組。以下樣本使用 Array 建構函式建立一個名為 monitorInfo
 的關聯陣列,並添加一個名為 type
 的鍵和一個名為 resolution
 的鍵以及它們的值:

var monitorInfo:Array = new Array();
monitorInfo["type"] = "Flat Panel";
monitorInfo["resolution"] = "1600 x 1200";
trace(monitorInfo["type"], monitorInfo["resolution"]);
// 輸出: Flat Panel 1600 x 1200

使用 Array 建構函式建立關聯陣列沒有什麼優勢。即使使用 Array 建構函式或 Array 資料類型,也不能將 Array 類的 Array.length
 屬性或任何方法用於關聯陣列。最好將 Array 建構函式用於建立索引數組。


具有對象鍵的關聯陣列

可以使用 Dictionary
類建立使用對象而非字串作為鍵的關聯陣列。這樣的數組有時候也稱作字典、雜湊或映射。例如,考慮這樣一個應用程式,它可根據 Sprite
對象與特定容器的關聯確定 Sprite 對象的位置。可以使用 Dictionary 對象,將每個 Sprite 對象映射到一個容器。

以下代碼建立三個用作 Dictionary 對象的鍵的 Sprite 對象執行個體。它為每個鍵分配了值 GroupA
 或 GroupB
。值可以是任意資料類型,但在此樣本中,GroupA
 和 GroupB
 均為 Object 類的執行個體。然後,可以使用屬性訪問運算子 ([]
) 訪問與每個鍵關聯的值,如以下代碼所示:

import flash.display.Sprite;
import flash.utils.Dictionary;
var groupMap:Dictionary = new Dictionary();
// 要用作鍵的對象
var spr1:Sprite = new Sprite();
var spr2:Sprite = new Sprite();
var spr3:Sprite = new Sprite();
// 要用作值的對象
var groupA:Object = new Object();
var groupB:Object = new Object();
// 在字典中建立新的鍵-值對。
groupMap[spr1] = groupA;
groupMap[spr2] = groupB;
groupMap[spr3] = groupB;
if (groupMap[spr1] == groupA)
{
trace("spr1 is in groupA");
}
if (groupMap[spr2] == groupB)
{
trace("spr2 is in groupB");
}
if (groupMap[spr3] == groupB)
{
trace("spr3 is in groupB");
}


使用對象鍵逐一查看

可以使用 for..in
 迴圈或 for each..in
 迴圈來逐一查看 Dictionary 對象的內容。for..in
 迴圈用來基於鍵進行逐一查看;而 for each..in
 迴圈用來基於與每個鍵關聯的值進行逐一查看。

可以使用 for..in
 迴圈直接存取 Dictionary 對象的對象鍵。還可以使用屬性訪問運算子 ([]
) 訪問 Dictionary 對象的值。以下代碼使用前面的 groupMap
 字典樣本來說明如何使用 for..in
 迴圈來逐一查看 Dictionary 對象:

for (var key:Object in groupMap)
{
trace(key, groupMap[key]);
}
/* 輸出:
[object Sprite] [object Object]
[object Sprite] [object Object]
[object Sprite] [object Object]
*/

可以使用 for each..in
 迴圈直接存取 Dictionary 對象的值。以下代碼也使用 groupMap
 字典來說明如何使用 for each..in
 迴圈來逐一查看 Dictionary 對象:

for each (var item:Object in groupMap)
{
trace(item);
}
/* 輸出:
[object Object]
[object Object]
[object Object]
*/


對象鍵和記憶體管理

Adobe Flash Player 使用記憶體回收系統來恢複不再使用的記憶體。當對象不具有指向它的引用時,即可對其進行記憶體回收,並會在下次執行記憶體回收系統時恢複記憶體。例如,以下代碼建立一個新對象,並將對此對象的引用分配給變數 myObject

var myObject:Object = new Object();

只要有對此對象的引用,記憶體回收系統就不會恢複此對象佔用的記憶體。如果更改 myObject
 的值以使其指向其它對象或將其設定為值 null
,並且沒有對原始對象的其它引用,則可以對原始對象佔用的記憶體進行記憶體回收。

如果將 myObject
 用作 Dictionary 對象中的鍵,則會建立對原始對象的另一個引用。例如,以下代碼建立兩個對象引用(myObject
 變數和 myMap
 對象中的鍵):

import flash.utils.Dictionary;
var myObject:Object = new Object();
var myMap:Dictionary = new Dictionary();
myMap[myObject] = "foo";

要使 myObject
 引用的對象能夠進行記憶體回收,您必須刪除對它的所有引用。在此情況下,必須更改 myObject
 的值並從 myMap
 中刪除 myObject
 鍵,如以下代碼所示:

myObject = null;
delete myMap[myObject];

此外,它可以使用 Dictionary 建構函式的 useWeakReference
 參數,以使所有字典的鍵成為“弱引用”。記憶體回收系統忽略弱引用,也就是說只具有弱引用的對象可以進行記憶體回收。例如,在以下代碼中,要使對象能夠進行記憶體回收,您不需要從 myMap
 中刪除 myObject
 鍵:

import flash.utils.Dictionary;
var myObject:Object = new Object();
var myMap:Dictionary = new Dictionary(true);
myMap[myObject] = "foo";
myObject = null; // 使對象能夠進行記憶體回收。



// 輸出:Flat Panel 1600 x 1200


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.