|
6 Map容器 Map容器是MATLAB R2008b版本新增加的數(shù)據(jù)類型。 6.1 Map數(shù)據(jù)類型介紹 1.Map數(shù)據(jù)結(jié)構(gòu)概述 一個Map容器是一種快速鍵查找數(shù)據(jù)結(jié)構(gòu),可以提供多種方法對其中的個體元素進(jìn)行尋訪。和MATLAB其他多數(shù)數(shù)據(jù)結(jié)構(gòu)不同的是,一般的數(shù)據(jù)結(jié)構(gòu)只能通過整數(shù)下標(biāo)索引來進(jìn)行尋訪,而一個Map的索引可以是任何數(shù)值或者字符串。 對一個Map元素進(jìn)行尋訪的索引稱為“鍵”(key)。這些鍵和其相對應(yīng)的數(shù)據(jù)值存儲在Map中。一個Map的每一個條目都包括唯一的鍵和相對應(yīng)的值。圖3-6所示是一個儲存降雨量統(tǒng)計數(shù)據(jù)的Map,此Map中的一個索引是字符串“Aug”,對應(yīng)于該月的降雨量37.3。 圖3-6 月降雨量統(tǒng)計數(shù)據(jù)Map容器示意圖 Map中所使用的鍵不必像其他數(shù)組那樣限制在整數(shù)范圍內(nèi)。一個鍵可以是以下任何一種類型: (1)1xN字符串; (2)單精度或者雙精度實數(shù)標(biāo)量; (3)有符號或者無符號標(biāo)量整數(shù)。 Map中存儲的數(shù)據(jù)可以是任何類型,包括數(shù)值數(shù)組、結(jié)構(gòu)數(shù)組、元胞數(shù)組、字符串、對象,或者是其他Map。需要指出的是:當(dāng)Map中存儲的是數(shù)值標(biāo)量或者字符串?dāng)?shù)組的時候,該Map的內(nèi)存的使用效率最高。 2.Map類介紹 一個Map實際上是MATLAB中稱作Map類的一個對象。它也是一個句柄對象,和其他的MATLAB句柄對象一樣。 Map類的所有對象都具有3種屬性。用戶不能直接對這些屬性進(jìn)行修改,而只能通過作用于Map類的函數(shù)進(jìn)行修改。具體屬性說明見表3-9。 表3-9 Map類屬性介紹
查看Map屬性的方法:在Map名字的后面加一個小數(shù)點'.',然后跟著寫屬性名即可,和結(jié)構(gòu)數(shù)組的表現(xiàn)形式一樣。例如,為了查看名為mapObj的Map中的鍵類型,可以使用如下命令: mapObj.KeyType Map是一個句柄對象,因此,如果用戶創(chuàng)建了一個對象的副本,MATLAB并沒有創(chuàng)建一個新的Map,而是創(chuàng)建一個指定的已有Map的新句柄。如果用戶通過新句柄改變了Map中的內(nèi)容,MATLAB同時也會將此改變應(yīng)用于原始Map。但是用戶可以在不影響原始Map的情況下刪除新句柄。 表3-10中的函數(shù)可以應(yīng)用于Map類,具體的用法將在后面的章節(jié)中介紹。 表3-10 Map類函數(shù)
6.2 Map對象的創(chuàng)建 Map是一個Map類中的對象,它由MATLAB中名為“容器”(containers)的一個包來定義,可以通過構(gòu)造器函數(shù)來創(chuàng)建。在調(diào)用構(gòu)造器創(chuàng)建Map對象的過程中,必須指定包的名字containers: newMap = containers.Map(optional_keys_and_values) 1.空Map對象的創(chuàng)建 當(dāng)用戶在調(diào)用Map構(gòu)造器的時候,若未指定輸入變量,那么MATLAB將會創(chuàng)建一個空Map對象。例如: >> newMap = containers.Map() newMap = containers.Map handle Package: containers Properties: Count: 0 KeyType: 'char' ValueType: 'any' Methods, Events, Superclasses 空Map對象的屬性被設(shè)置為了默認(rèn)屬性: (1) Count = 0 (2) KeyType = 'char' (3) ValueType = 'any' 一旦用戶創(chuàng)建了空Map對象,之后就可以使用keys和values方法對其進(jìn)行填充。 2.初始化后的Map對象創(chuàng)建 大多數(shù)情況下,用戶希望在創(chuàng)建Map對象的時候就對其進(jìn)行初始化,至少對部分鍵和值進(jìn)行初始化。用戶可以通過以下語法輸入一個或多個keys/values對。 mapObj = containers.Map({key1, key2, ...}, {val1, val2, ...}); 對于鍵和值為字符串的情況,應(yīng)注意將字符串放到單引號里面。例如,創(chuàng)建一個包括字符串鍵的Map對象可以使用以下命令: mapObj = containers.Map(... {'keystr1', 'keystr2', ...}, {val1, val2, ...}); 【例3-30】 創(chuàng)建圖3-6中所示降雨量統(tǒng)計數(shù)據(jù)的Map對象。 >> k = {'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', ... 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Annual'}; >> v = {327.2, 368.2, 197.6, 178.4, 100.0, 69.9, ... 32.3, 37.3, 19.0, 37.0, 73.2, 110.9, 1551.0}; >> rainfallMap = containers.Map(k, v) rainfallMap =
Map with properties:
Count: 13 KeyType: char ValueType: double 從顯示的結(jié)果可以看出:Count屬性現(xiàn)在被設(shè)置成了Map中包括的keys/values 對的數(shù)目13,KeyType 屬性是char, ValueType 屬性則是double。 6.3 查看Map的內(nèi)容 Map中的每個條目都包括兩個部分:一個唯一的鍵和其相對應(yīng)的值??梢酝ㄟ^使用keys函數(shù)查看Map中包括的所有鍵,同時還可以使用values函數(shù)查看所有的值。 【例3-31】 Map內(nèi)容的查看方法示例。 創(chuàng)建一個名為tickets的Map對象,存儲航空公司機票的編號和乘客名字。 >> ticketMap = containers.Map(... {'2R175', 'B7398', 'A479GY', 'NZ1452'}, ... {'James Enright', 'Carl Haynes', 'Sarah Latham', ... 'Bradley Reid'}); >> keys(ticketMap) % 使用keys函數(shù)查看Map中包括的所有鍵 ans = '2R175' 'A479GY' 'B7398' 'NZ1452' >> values(ticketMap) % 使用values函數(shù)查看Map中包括的所有值 ans = 'James Enright' 'Sarah Latham' 'Carl Haynes' 'Bradley Reid' |
|
|