在MATLAB中,map类型的变量含义是映射,可以将一个量映射到另一个量,理解为快速查找数据结构的键。这个类型可以联想到数据库中主键和值之间的关系,一个键对应一个值。对map类型变量的增删改查,与数据库中的增删改查十分类似。
1. 关于map对象的操作
map对象查询
进行查询操作需要指定键名而非键对应的值,只能通过键名进行查询。
查询代码为:
ValueName = MapName(KeyName);
map对象删除
对map对象的删除需要指定键名而非键对应的值,而删除时会同时删除键及对应的值。
删除代码为:
remove(MapName, KeyName);
map对象添加
添加map对象时需要保证添加的键名与map对象中的键的类型一致,否则会报错。并且在添加时需要提供键以及对应的值,且map对象存在。
添加代码为:
MapName(KeyName) = Value;
map对象修改
(1)修改键对应的值
修改值的操作实际上与添加map对象的操作相同,实际上添加map对象也是一个覆盖的行为,而被覆盖的是内存上的某个地址值。
修改代码为:
MapName(KeyName) = Value;
(2)修改键
键在实际上是不可修改的,所以修改键的操作必须要经过两个步骤来完成,首先需要删除需要修改的键,然后添加新的键。在其中,键对应的值需要保存下来以便添加。
修改代码为:
Value = MapName(old_KeyName);
remove(MapName, old_KeyName);
MapName(new_KeyName) = Value;
2. 用一个函数完成map变量的增删改查
在编写代码中出现需要对一个map类型变量多次操作或者多个map类型变量操作时,不可能对每一次操作都直接调用上述代码。为了更加方便阅读以及编写,将这些操作整合成一个函数使用很有必要。
需要的函数应满足:
(1)map类型变量中起到决定作用的包括三个:map变量名、键名及对应的值;
(2)通过一个控制操作方式的变量operate来判断对map变量的操作;
(3)返回值或者完成操作的提示信息。
函数代码如下(map_edit.m):
function result = map_edit(operate, mapname, keyname, value)
% map_edit函数操作map变量,完成map变量的增删改查
% 输入四个参数:操作方式(字符串)、map名、键名、值
% operate可用'read'(查询读取)、'delete'(删除)、'add'(添加)、'change_value'(修改值)、'change_keyname'(修改键)
% 除查询读取输出值外,函数返回字符串
switch operate
case 'read' % value未使用,输入可用任意值
result = mapname(keyname);
case 'delete' % value未使用,输入可用任意值
remove (mapname, keyname);
result = 'Complete Delete!';
case 'add'
mapname(keyname) = value;
result = 'Complete Add!';
case 'change_value'
mapname(keyname) = value;
result = 'Complete Change Value!';
case 'change_keyname' % keyname为旧键名,value为新键名
old_value = mapname(keyname);
remove(mapname, keyname);
mapname(value) = old_value;
result = 'Complete Change Keyname!';
end
在上述代码中,使用switch-case语句来判断操作方式。在某些操作方式中,value的值并未使用或者含义不同,这些皆已注释标出。
接下来,通过以下代码对该函数进行测试(map_edit_test.m):
test_map = containers.Map({'Monday','Tuesday','Wednesday','Thursday'},{'Math','Chinese','History','Geography'});
% 查询
operate = 'read';
mapname = test_map;
keyname = 'Monday';
value = 0;
result = map_edit(operate, mapname, keyname, value);
disp(result);
% 删除
operate = 'delete';
result = map_edit(operate, mapname, keyname, value);
disp(result);
% 增加
operate = 'add';
keyname = 'Friday';
value = 'Biology';
result = map_edit(operate, mapname, keyname, value);
disp(result);
% 修改值
operate = 'change_value';
value = 'English';
result = map_edit(operate, mapname, keyname, value);
disp(result);
% 修改键
operate = 'change_keyname';
old_keyname = 'Tuesday';
new_keyname = 'Saturday';
result = map_edit(operate, mapname, old_keyname, new_keyname);
disp(result);
在该测试文件中:
(1)首先定义了一个map类型变量来进行测试;
(2)查询键为’Monday’的值并输出函数返回值;
(3)删除键为’Monday’的值并输出函数返回值;
(4)增加以’Friday’为键,‘Biology’为值的map对象,并输出函数返回值;
(5)修改‘Friday’的值,将‘Biology’改为‘English’,并输出函数返回值;
(6)修改‘Tuesday’的键名,将‘Tuesday’键名改为‘Saturday’。
测试文件运行返回结果及控制台查询:
>> map_edit_test
Math
Complete Delete!
Complete Add!
Complete Change Value!
Complete Change Keyname!
>> test_map('Monday')
Error using containers.Map/subsref
The specified key is not present in this container.
>> test_map('Friday')
ans =
'English'
>> test_map('Tuesday')
Error using containers.Map/subsref
The specified key is not present in this container.
>> test_map('Saturday')
ans =
'Chinese'
测试代码能够正常完成运行。
另外通过控制台查询了经过操作后的map类型变量中的某些值,结果显示函数能够成功地完成增删改查。
以上,就是如何使用一个函数对map类型变量完成增删改查操作的具体细节。此内容是我在学习过程中整合所得,特将其写出以供参考。
–注:此文章为自创,若无本人同意,禁止转载。–