Ruby中如何将值为数组的哈希转换为数组元素为键、原键数组为值的哈希
Ruby 哈希按值反向映射实现方案
核心实现代码
针对给出的转换规则,最符合Ruby编码习惯、性能与可读性平衡的实现如下:
# 原始哈希 original = { 1 => [], 2 => ["A", "B"], 3 => ["C"], 4 => ["B", "C"], 5 => ["D"] } converted = original.each_with_object(Hash.new { |hash, key| hash[key] = [] }) do |(origin_key, origin_vals), res| if origin_vals.empty? res["default"] << origin_key else origin_vals.each { |val| res[val] << origin_key } end end
执行后得到的结果完全匹配预期:
p converted # 输出: {"A"=>[2], "B"=>[2, 4], "C"=>[3, 4], "D"=>[5], "default"=>[1]}
实现说明
- 用
Hash.new { |h,k| h[k] = [] }初始化结果哈希,访问不存在的键时会自动创建对应空数组,省去手动判断键是否存在、初始化空数组的冗余代码 - 仅遍历一次原始哈希,时间复杂度为O(n)(n为原始哈希所有值数组的元素总个数),没有多余的中间对象生成,性能最优
- 逻辑分支直接对应转换规则:原始值为空数组时,将原始键归入
default数组;非空时遍历值数组的每个元素,把原始键追加到对应新键的数组中
可选调整
如果需要强制让default键固定在结果哈希的末尾(不受原始哈希中空数组键的位置影响),可以在转换完成后追加一行处理:
converted["default"] = converted.delete("default") if converted.key?("default")
这行代码会先取出已生成的default值,删除原有位置的键值对后重新追加到哈希末尾。
内容的提问来源于stack exchange,提问作者akjain
相关产品推荐
相关产品推荐

