如何在Ruby中访问哈希值[2]的最小值

4

如何在Ruby中访问哈希表中特定列的最小值或最大值

我有一个包含键值的数组值的哈希表。我想要获取数组值的特定列中的最小或最大值,以便我可以更改第一列的值。以下是我的代码。有什么建议吗?

lru_c() 当我运行此代码时,我得到了0,即第三个哈希表的值的最小值。我需要的是数组值的第二列的最小值,即[6, 2, 9, 4].min。我想要访问具有最小值的h [2](最后一列)。

def lru_c()
    h = Hash.new{|hsh,key| hsh[key] = [] }

    h[1] = [0,0,6]
    h[2] = [0,0,2]
    h[3] = [0,0,9]
    h[4] = [7,1,4]

    puts h.values[2].min
end

2
@Amadan 哦,确实。h.min_by { |_, v| v.last } 当然,谢谢! - Aleksei Matiushkin
嗨,谢谢你的解决方案。不过,对我来说这似乎没有正常工作。也许是我没有正确表达我的问题。无论如何,再次感谢。 - Raj
你能解释一下为什么@AlekseiMatiushkin的解决方案对你不起作用吗?你可以使用它作为h[h.min_by{|_,v| v.last}.first][0] = :whatever,所以h #=> {1=>[0, 0, 6], 2=>[:whatever, 0, 2], 3=>[0, 0, 9], 4=>[7, 1, 4]} - iGian
Raj,不清楚你所寻找的答案是2,因为它是所有值的第二列的最小值,还是因为它是包含所有值的第二列的最小值的哈希条目的键,或者是h[2],它是包含所有值的第二列的最小值的值数组。请明确说明返回值应该是什么,使用一个没有键、值和值索引之间歧义的例子来说明。 - pjs
2个回答

2

collect 会遍历任何可枚举的对象,例如哈希表,以创建一个包含块参数指定的值的数组。由于它返回一个数组,因此可以使用 .min

“最初的回答”

h.collect { |_, value| value[2] }.min

哈希的枚举器会提供键和值,但是由于您的规格不需要键,所以我使用了一个 _ 占位符。
如果有任何可能有些值没有 [2] 索引的情况,请将 .min 更改为 .compact.min
"最初的回答"

1
这并没有返回预期的结果(h[2] _数组_)。 - Aleksei Matiushkin
@AlekseiMatiushkin 我对Raj的问题的理解是:1)他要查找的数组由每个哈希值的第2列元素组成;2)他只想要最后的min值,数组本身并不重要。如果您想保留数组以某种原因,请将其分配给一个变量,然后应用min - pjs

1

我不是专家,但我会选择以下动态解决方案:

def fetch_value_of(hash, col, min_max)
  hash.map{|_key, values| values[col]}.send("#{min_max}")
end 

您需要传递散列函数、您想要获取的最大/最小值的列和值。

例如:

fetch_value_of(h, 2, 'max')

发送?!为什么? - Aleksei Matiushkin
嗨,谢谢你的解决方案。我需要一行代码而不必编写另一个方法。无论如何,再次感谢。 - Raj
然后你也可以将这个方法转换为单行,我只是将它分开,因为我更喜欢模块化和动态的方式,而不是线性的方式,尽管你可以定义变量并使线性方式也变得动态。 - Ashok Damaniya
“send”是一种方法,可以动态地传递方法名称以调用方法。简单来说,这就是所谓的“动态方法调用”。 - Ashok Damaniya
我知道 send 的作用,谢谢。只是在这里看起来有点奇怪,因为你可能会 a) 使用 public_send,这总是首选;b) 你不需要插入一个参数,public_send(min_max) 完全可以工作。 - Aleksei Matiushkin
第一个点我不知道,所以感谢分享,是的第二个点在没有插值的情况下可以正常工作。谢谢@AlekseiMatiushkin - Ashok Damaniya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接