2

配列内のオブジェクトのインデックスを見つけるためのルックアップ テーブルを作成したいと考えています。

配列["a", "b", "c"]を取得し、各オブジェクトのインデックスのルックアップ ハッシュ テーブルを生成します{"a"=>0, "b"=>1, "c"=>2}

私が思いつく最も簡単な方法は次のとおりです。

i = 0
lookup = array.each_with_object({}) do |value,hash|
  hash[value] = i
  i += 1
end

と:

i = -1
lookup = Hash[array.map {|x| [x, i+=1]}]

これを行うためのよりエレガントなソリューションがあると思います。どんなアイデアでも大歓迎です!

4

4 に答える 4

4

これはどう:

Hash[array.zip 0..array.length]
于 2012-10-17T21:54:55.283 に答える
2

apneadiving のコードよりも少し遅いですが、より単純です。

 Hash[array.map.with_index.to_a]
于 2012-10-18T03:45:40.677 に答える
2
lookup  = Hash[array.each_with_index.map{|el,i| [el, i]}]

@Mark Thomasの答えは私のものよりもさらに速いです:

array = (0..100000).to_a;
Benchmark.bm do |x|
  x.report { Hash[array.each_with_index.map{|el,i| [el, i]}] }
  x.report { Hash[array.zip 0..array.length] }
end

     user     system      total        real
 0.050000   0.010000   0.060000 (  0.053233)
 0.040000   0.000000   0.040000 (  0.036471)
于 2012-10-17T21:52:51.867 に答える
1

もしかしてこれ?

lookup = {}
arr.each_with_index { |elem,index|  lookup[elem] = index }
于 2012-10-17T21:41:48.670 に答える