如何实现Ruby哈希反转:将值元素映射至对应原键集合
Ruby哈希反转:将值中的元素映射到原键集合
给定如下Ruby哈希:
a = { 7 => [1469, 2283], 5 => [1469, 5464], 3 => [7561], 6 => [7952, 8114], 4 => [] }
需要将哈希值中的每个数字映射到其所在的原键集合,得到目标哈希:
b = { 1469 => [7,5], 2283 => [7], 5464 => [5], 7561 => [3], 7952 => [6], 8114 => [6] }
简洁高效的实现方法
方法一:遍历构建(直观高效)
b = a.each_with_object({}) do |(key, values), result| values.each { |num| (result[num] ||= []) << key } end
- 逻辑:遍历原哈希的每一对键值,对值数组中的每个数字,在结果哈希中初始化或追加对应的原键。
- 优势:直接在遍历过程中构建结果,内存占用低,自动忽略空数组(空数组不会进入内层循环)。
方法二:链式调用(写法紧凑)
b = a.flat_map { |k, vs| vs.map { |v| [v, k] } } .group_by(&:first) .transform_values { |arr| arr.map(&:second) }
- 逻辑:先将原哈希转换为
[数字, 原键]的二维数组,再按数字分组,最后提取分组中的原键组成目标数组。 - 优势:代码简洁,符合Ruby链式调用的风格,可读性强。
两种方法都能高效完成需求,可根据个人编码习惯选择。
内容的提问来源于stack exchange,提问作者timpone
相关产品推荐
相关产品推荐

