2012-04-02 8 views
0

この投稿は、私の前のものと非常によく似ていますが、データ構造は、ここで異なっている:私のMysql2から Joining an array of keys to a hash with key value pairs like excel vlookupは、ExcelのようなRubyでハッシュの配列のキーの配列を見上げるVLOOKUP

マイデータ::結果は、ハッシュのこの配列のように戻ってくる:

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

そして、私は比較したいISBNコードの私の元のリストは、この配列です:

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

「駆動」配列は、ISBNコード...データにISBNコードからVLOOKUPをやって想像...任意の項目です:私はISBNコード配列を使用して、このような結果を返す関数を求めていますデータには含まれていませんが、isbnsにはnilが返されます。 isbnsの元の順序が返され、戻りデータはハッシュの配列でなければなりません。

答えて

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

duuuude倍速いだろう...ありがとう! – hagope

1

@Michael Kohlの答えは簡潔で正確です。しかし、これらのデータセットが大きければ、効率が悪いO(n * m/2)です。代わりに、データベクトルをO(m)のハッシュに変換し、O(n + m)の実行時間のためにO(n)のマップを実行する。

data_lookup = data.inject({}) {|m,v| m[v["isbn"]] = v; m} # O(data.size) 
result = isbns.map { |isbn| data_lookup[isbn] }   # O(isbns.size) 

データやISBNコレクションのサイズ1000年それぞれのであれば、これは250

+0

オハイオ州これは、大学の勉強のために戻ってきている大学の勉強スクーです...私は確かにそれを試してみましょう – hagope

+0

1000レコードでは、あなたの呼び出しは0.008449514を取った、最初の呼び出しは0.234835044を取った – hagope

+0

@ハゴープbig-O分析に基づく私の見積もりとかなりよく似ています。ときどきこの計算を実行するだけでは巨大な問題ではありません(ただし、235msは単一のWeb要求に対してかなりの遅延です)。大規模で、この計算を500回/秒で行う必要がある場合は、高速バージョンでは1つの一般的な4コアプロセッサで管理できますが、遅いものでは10の12コアサーバが必要です。 – dbenhur

関連する問題