Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在类似ruby的excel vlookup中查找哈希数组上的键数组_Ruby_Arrays_Hash_Hashmap - Fatal编程技术网

在类似ruby的excel vlookup中查找哈希数组上的键数组

在类似ruby的excel vlookup中查找哈希数组上的键数组,ruby,arrays,hash,hashmap,Ruby,Arrays,Hash,Hashmap,这篇文章与我之前的文章非常相似,但这里的数据结构不同: 我的Mysql2::Result中的数据以如下哈希数组的形式返回: data = [{"isbn" => "1234", "title"=>"apple"},{"isbn" => "5678", "title"=>"banana"},{"isbn" => "2121", "title"=>"car"}] 我想比较的原始ISBN列表是以下数组: isbns = ["1234","2121", "5454

这篇文章与我之前的文章非常相似,但这里的数据结构不同:

我的Mysql2::Result中的数据以如下哈希数组的形式返回:

data = [{"isbn" => "1234", "title"=>"apple"},{"isbn" => "5678", "title"=>"banana"},{"isbn" => "2121", "title"=>"car"}]
我想比较的原始ISBN列表是以下数组:

isbns = ["1234","2121", "5454", "5678"]
我正在寻找一个使用isbns数组并返回如下结果的函数:

result = [{"isbn"=>"1234","title"=>"apple"}, {"isbn"=> "2121", "title"=>"car"}, nil, {"isbn"=>"5678","title"=>"banana"}]

“驱动”阵列是isbns。。。想象一下从ISBN到数据进行vlookup。。。任何不在数据中但在isbns中的项都应返回nil。ISBN的原始顺序应该被返回,返回的数据应该是一个散列数组。

@Michael Kohl的回答简洁而正确。但是,如果这些数据集很大,则效率很低(n*m/2)。另一种方法是将数据向量转换为O(m)中的散列,然后在O(n)中为O(n+m)的运行时进行映射

isbns.map { |isbn| data.find { |h| h["isbn"] == isbn} }
#=> [{"isbn"=>"1234", "title"=>"apple"}, {"isbn"=>"2121", "title"=>"car"}, nil, {"isbn"=>"5678", "title"=>"banana"}]

如果你的数据和isbn收集的数据都是1000条,那么速度会快250倍。

哦,该死的,这是大学校报回来咬我的屁股…感谢你的建议,我一定会给它1000条记录,你的电话花了0.008449514,第一次通话花费了0.234835044s@hagope这与我根据big-O分析得出的估计非常接近。如果您只是偶尔运行此计算,这不是一个大问题(尽管235ms对于单个web请求来说是一个相当大的延迟)。如果您的规模很大,并且需要以500次/秒的速度进行计算,那么快速版本可以通过一个常见的四核处理器来实现这一点,而慢速版本则需要10台12核服务器才能跟上。我总是首先追求代码的清晰性,一旦证明速度较慢,您就可以进行优化。另外,没有提到Rails,因此我不知道web请求的速度是从哪里来的总之,+1。@MichaelKohl没有抱怨,我只是添加了一个BTW。s/web请求/交互/如果你愿意,Rails不是ruby中计算http响应的唯一工具,web也不是四分之一秒延迟可能困扰用户的唯一环境。
data_lookup = data.inject({}) {|m,v| m[v["isbn"]] = v; m} # O(data.size)
result = isbns.map { |isbn| data_lookup[isbn] }           # O(isbns.size)