You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建键重复时将值拼接为向量的Map(哈希表)?

嘿,这个问题我之前也碰到过——MATLAB自带的containers.Map默认就是键唯一,重复赋值直接覆盖,确实没法直接实现同键值拼接。这里有几个实用且高效的方案,你可以根据自己的需求选:

方案1:手动扩展containers.Map功能,循环处理键值对

这个方法最直观,也最灵活,不管你的键是字符串、数值还是其他合法类型都能用上:

% 初始化空Map,指定键类型为char,值类型设为any(方便存向量)
myMap = containers.Map('KeyType','char','ValueType','any');

% 模拟你的待添加键值对(比如键'333'对应327.2和69.9)
keyValuePairs = {'333',327.2; '111',100; '333',69.9};

for i = 1:size(keyValuePairs,1)
    currentKey = keyValuePairs{i,1};
    currentValue = keyValuePairs{i,2};
    
    if isKey(myMap, currentKey)
        % 键已存在,把新值追加到已有向量末尾
        existingVals = myMap(currentKey);
        myMap(currentKey) = [existingVals, currentValue];
    else
        % 键不存在,直接存为单个元素的向量
        myMap(currentKey) = currentValue;
    end
end

% 测试输出:会得到 [327.2, 69.9]
disp(myMap('333'));

方案2:用结构体实现(语法更简洁)

如果你的键都是合法的MATLAB变量名(比如你例子里的数字字符串'333'),用结构体的语法会更清爽:

myStruct = struct();

keyValuePairs = {'333',327.2; '111',100; '333',69.9};

for i = 1:size(keyValuePairs,1)
    currentKey = keyValuePairs{i,1};
    currentValue = keyValuePairs{i,2};
    
    if isfield(myStruct, currentKey)
        myStruct.(currentKey) = [myStruct.(currentKey), currentValue];
    else
        myStruct.(currentKey) = currentValue;
    end
end

% 测试输出:同样得到 [327.2, 69.9]
disp(myStruct.333);

方案3:向量化批量处理(大数据量首选)

如果你的数据量很大,循环的效率会有点低,这时候用unique+accumarray的向量化方案会快很多:

% 把键和值分别提取为独立数组
keysList = {'333','111','333'};
valuesList = [327.2, 100, 69.9];

% 将字符串键转换为数值索引,方便accumarray分组
[uniqueKeys, ~, groupIdx] = unique(keysList);

% 用accumarray把同组的值打包成向量(存为cell数组)
groupedVals = accumarray(groupIdx, valuesList, [], @(x) {x});

% 可选:把结果转成Map,方便按键查找
resultMap = containers.Map(uniqueKeys, groupedVals);

% 测试输出:注意这里返回的是cell数组,需要用花括号取出向量
disp(resultMap('333'){1});

各方案适用场景

  • 方案1:适合键类型复杂(比如非变量名字符串、数值键),或者需要随时动态添加键值对的场景;
  • 方案2:适合键是合法变量名的情况,语法更简洁易读;
  • 方案3:适合批量处理大量数据,向量化操作比循环效率高得多。

内容的提问来源于stack exchange,提问作者Phibins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:37:11