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