在Ruby中搜索数组的更好方法?

时间:2015-06-25 00:58:11

标签: ruby-on-rails arrays ruby search find

我有一系列哈希:

arr = [{"id"=>"1", "name"=>"Alan"}, {"id"=>"2", "name"=>"Ben"}, {"id"=>"3", "name"=>"Carl"}, {"id"=>"4", "name"=>"Danny"}, {"id"=>"5", "name"=>"Eva"}]

如果我要找到id#4的名称:

arr.find{ |a| a["id"] == "4" }["name"]

返回“Danny”,这就是我想要的。

我的问题是,是否有更短,更优雅的方式来完成相同的搜索?

2 个答案:

答案 0 :(得分:4)

如果你只需要查找一个id,就可以进行线性搜索。

如果在同一个数组上进行多次查找,请从数组中创建一个哈希,因此单个查找为O(1)

h =  Hash[arr.map{|a|[a["id"], a["name"]]}]
h["4"]

答案 1 :(得分:0)

这是一种非常合理的方式。我看到的唯一问题是您的数据结构不是查找友好的。您需要在数组中搜索,而不是在哈希中按ID查找。在数组中搜索是O(N)并且是相对更难的代码。查找哈希是O(1)并且根本没有代码。

所以,我会将你的数组转换为hash,然后查找它。特别是,如果您打算进行多次查找。

people = arr.inject({}) {|memo,v| memo[v["id"].to_i]=v["name"]; memo}
people[4] # will return Danny
people[3] # will return Carl

希望它有所帮助!