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类属性介绍

属    性

说    明

无符号64位整数,表示Map对象中存储的key/value对的总数

字符串,表示Map对象中包括的key的类型。KeyType可以是如下类型:双精度,单精度,有符号或者无符号32位或64位整数。如果用户添加了不支持的类型,如int8,MATLAB会自动将其转换为双精度类型

字符串,表示Map对象中包括的数据类型。如果一个Map中存储的是同一种类型的数据,那么ValueType就会被设置成该类型。例如Map中的数据全部为字符串数组,那么ValueType就是'char'。在其他情况下,ValueType的值是 'any'

查看Map属性的方法:在Map名字的后面加一个小数点'.',然后跟着写属性名即可,和结构数组的表现形式一样。例如,为了查看名为mapObj的Map中的键类型,可以使用如下命令:

mapObj.KeyType

Map是一个句柄对象,因此,如果用户创建了一个对象的副本,MATLAB并没有创建一个新的Map,而是创建一个指定的已有Map的新句柄。如果用户通过新句柄改变了Map中的内容,MATLAB同时也会将此改变应用于原始Map。但是用户可以在不影响原始Map的情况下删除新句柄。

表3-10中的函数可以应用于Map类,具体的用法将在后面的章节中介绍。

表3-10 Map类函数

函    数

说    明

函    数

说    明

检查Map是否包含指定键

在Map中删除键和其相对应的值

Map中所有键的名称

Map的尺寸

Map的长度

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()

containers.Map handle

Package: containers

Properties:

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'};

32.3,  37.3,  19.0,  37.0,  73.2, 110.9, 1551.0};

>> rainfallMap = containers.Map(k, v)

rainfallMap =

Map with properties:

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中包括的所有键

'2R175'    'A479GY'    'B7398'    'NZ1452'

>> values(ticketMap)          %  使用values函数查看Map中包括的所有值