我目前正在尝试在一个月内映射一些数据,具体取决于'Month'
,'week'
,'day'
。
这意味着原则上我有三把钥匙。我想到了解决问题的方法:
1)
containers.Map(month,containers.Map(week,containers.Map(day,value)))
此解决方案的问题是引用它我必须使用:How can I index a MATLAB array returned by a function without first assigning it to a local variable?。
我发现这个解决方案相当“难看”。
2)
另一种方法是使用带有多个键的Map
。 containers documentation表示只允许使用单个维度键。
问题:
你有解决这个多重关键问题的技巧吗?
更新/解决方案:
我最后使用连接字符串作为键(如建议的那样)我添加了以下代码片段以使containers.Map
成为正确的多维hashmap。看看下面(我排除了一周的简化):
classdef example
properties
myMap % Map for storage
end
methods
function obj = example()
obj.myMap = containers.Map;
end
function obj2 = setVal(obj2,value,Month,DayType)
key = strcat(num2str(Month),'-',num2str(DayType));
obj2.myMap(key) = value;
end
function value = getValue(obj,Month,DayType)
key = strcat(num2str(Month),'-',num2str(DayType));
value = obj.myMap(key);
end
end
答案 0 :(得分:1)
您也许可以使用这三个键来构建单个键。我假设这可以Month
完成,week
和day
可以视为唯一。每次出现只有一个唯一组合。因此,只需将这些键构建为单个字符串,然后将这些键用作词典/ containers.Map()
中的键。
以下是一个例子:
%// Test data
month1 = 'May';
week1 = 2;
day1 = 'Thursday';
month2 = 'June';
week2 = 3;
day2 = 'Friday';
month3 = 'July';
week3 = 4;
day3 = 'Sunday';
%// Define keys
key1 = [month1 num2str(week1) day1];
key2 = [month2 num2str(week2) day2];
key3 = [month3 num2str(week3) day3];
%// Build dictionary
M = containers.Map();
M(key1) = 'Hello!';
M(key2) = 'Testing!';
M(key3) = 'Yes!';
%// Now test accessing
disp(M(key1));
disp(M(key2));
disp(M(key3));
上面的代码需要三个月,三周和几天,将它们转换为字符串,并将它们用作字典中的键。我不知道输出类型是出于什么目的,所以我只是分配了字符串。请注意,我使用了数字并使用num2str
将数字转换为字符串以确保与字符串的其余部分兼容。我不知道week
是什么数据类型(或实际上任何其他变量......),所以只需使用我拥有的数据并根据自己的目的进行修改。
我创建了字典,然后测试它,我用每个键访问每个值。正如所料,我的输出是:
Hello!
Testing!
Yes!
答案 1 :(得分:0)
Matlabs文件交换上有一个新的MapNested类: http://de.mathworks.com/matlabcentral/fileexchange/62492-mapnested-implementation-for-nested-maps--map-of-maps-
或在github上:
https://github.com/RolandRitt/Matlab-NestedMap
看看吧!
设置值的语法如下:
NMapobj = MapNested(); %constructor;
NMapobj(key1, key2, key3) = value;
用于检索:
value = NMapobj(key1, key2, key3);