通过值获取键和通过键获取值的 Ruby 数组哈希操作

3

我有一个哈希表{ "1" => "one", "2" => "two", "3" => "three" }

如何通过值获取键和通过键获取值。

如果我传递"1",我会得到"one",如果我传递"two",我会得到"2"。

def finder (string)
  table = { "1" => "one", "2"   =>  "two", "3"  =>  "three" }
  *magick*
  }
  return string
end
puts finder("1") => one
puts finder("one") => 1

table.each {|from,to| string.sub!(from,to) return string但它只能单向工作,将键替换为值。 - Dmitriy K
1
还有它是{ "1" => "one", "2" => "two", "3" => "three" }而不是数组。 - Roman Kiselenko
你尝试过编写键值反转函数吗?你能分享一下实际的代码吗? - Roman Kiselenko
好的,已更新带有函数。 - Dmitriy K
@DmitriyK [...] 是一个 数组,而 {...} 则是一个 哈希表。除此之外,您期望的结果是什么? - Stefan
1
puts finder("one") => 应该返回 "1" - Dmitriy K
2个回答

17

Hash#key 返回给定值所对应的键:

@hash = {"1"=>"one", "2"=>"two", "3"=>"three"}
@hash.key("one") #=> "1"

如果不存在这样的值,则为 nil

@hash.key("four") #=> nil

要获取键(key)的值或值(value)的键,您可以使用:

def finder(str)
  @hash[str] || @hash.key(str)
end

finder("1")   #=> "one"
finder("one") #=> "1"

puts hash.key("1") => "one"puts hash.has_value?("one")我不知道我传递的是键还是值 - Dmitriy K
@DmitriyK,我之前并不清楚你需要两者。我已经相应地更新了我的答案。也许你也应该更新一下你的问题 :-) - Stefan
可以和我的代码结合吗?我不明白那个@hash,这对我来说是新的。 - Dmitriy K
@DmitriyK @hash 是一个实例变量。我用它来进行演示,因为你可以在方法内部访问它(这样我就不需要定义两次哈希表)。只需将其替换为table即可。 - Stefan
你知道 key 是执行键的线性搜索还是 Ruby 会同时维护一个值到键和键到值的哈希表吗? - Cary Swoveland
@CarySwoveland 前往 https://ruby-doc.org/core-2.5.0/Hash.html#method-i-key(答案中的第一个链接),并在鼠标悬停时单击文档右上角的“点击切换源”按钮。您将看到它是如何实现的。 - pensan

4

如果您的哈希表很大且需要重复查询,您可以创建一个新的哈希表以提高查询速度:

h = {"1"=>"one", "2"=>"two", "3"=>"three"}
nh = h.merge h.invert
  #=> {"1"=>"one", "2"=>"two", "3"=>"three", "one"=>"1", "two"=>"2", "three"=>"3"} 

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