6 Map容器 Map容器是MATLAB R2008b版本新增加的数据类型。 6.1 Map数据类型介绍 1.Map数据结构概述 一个Map容器是一种快速键查找数据结构,可以提供多种方法对其中的个体元素进行寻访。和MATLAB其他多数数据结构不同的是,一般的数据结构只能通过整数下标索引来进行寻访,而一个Map的索引可以是任何数值或者字符串。 对一个Map元素进行寻访的索引称为“键”(key)。这些键和其相对应的数据值存储在Map中。一个Map的每一个条目都包括唯一的键和相对应的值。图3-6所示是一个储存降雨量统计数据的Map,此Map中的一个索引是字符串“Aug”,对应于该月的降雨量37.3。 图3-6 月降雨量统计数据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名字的后面加一个小数点'.',然后跟着写属性名即可,和结构数组的表现形式一样。例如,为了查看名为mapObj的Map中的键类型,可以使用如下命令: mapObj.KeyType Map是一个句柄对象,因此,如果用户创建了一个对象的副本,MATLAB并没有创建一个新的Map,而是创建一个指定的已有Map的新句柄。如果用户通过新句柄改变了Map中的内容,MATLAB同时也会将此改变应用于原始Map。但是用户可以在不影响原始Map的情况下删除新句柄。 表3-10中的函数可以应用于Map类,具体的用法将在后面的章节中介绍。 表3-10 Map类函数
6.2 Map对象的创建 Map是一个Map类中的对象,它由MATLAB中名为“容器”(containers)的一个包来定义,可以通过构造器函数来创建。在调用构造器创建Map对象的过程中,必须指定包的名字containers: newMap = containers.Map(optional_keys_and_values) 1.空Map对象的创建 当用户在调用Map构造器的时候,若未指定输入变量,那么MATLAB将会创建一个空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' 一旦用户创建了空Map对象,之后就可以使用keys和values方法对其进行填充。 2.初始化后的Map对象创建 大多数情况下,用户希望在创建Map对象的时候就对其进行初始化,至少对部分键和值进行初始化。用户可以通过以下语法输入一个或多个keys/values对。 mapObj = containers.Map({key1, key2, ...}, {val1, val2, ...}); 对于键和值为字符串的情况,应注意将字符串放到单引号里面。例如,创建一个包括字符串键的Map对象可以使用以下命令: mapObj = containers.Map(... {'keystr1', 'keystr2', ...}, {val1, val2, ...}); 【例3-30】 创建图3-6中所示降雨量统计数据的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属性现在被设置成了Map中包括的keys/values 对的数目13,KeyType 属性是char, ValueType 属性则是double。 6.3 查看Map的内容 Map中的每个条目都包括两个部分:一个唯一的键和其相对应的值。可以通过使用keys函数查看Map中包括的所有键,同时还可以使用values函数查看所有的值。 【例3-31】 Map内容的查看方法示例。 创建一个名为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' |
|