0

私は2次元配列を持っています

v = [ ["ab","12"], ["ab","31"], ["gh","54"] ]

vのサブ配列の最初の要素には、などの繰り返し要素があり"ab"ます。キーをサブ配列の最初の要素として配置し、値をに対応する2番目の要素の配列として配置するハッシュを作成したいと思いますv

ご意見をお聞かせください。

さらに、これが必要です。h= {"ab" => ["12"、 "31"]、 "gh" => ["54"]}次に、配列[ ["12"、 "31"]、["54"]]が返されます

4

3 に答える 3

4
v.inject(Hash.new{|h,k|h[k]=[]}) { |h, (k, v)| h[k] << v ; h}

内容:

  • インジェクト(別名reduce)はフォールドです。Wikipediaは、次のようにフォールドを定義しています。「再帰的なデータ構造を分析し、特定の結合操作を使用してその構成要素を再帰的に処理し、戻り値を構築した結果を再結合する高階関数のファミリー」。

  • Hash.newのブロック形式は、ハッシュ自体とキーの2つの引数を取ります。デフォルトの引数が可変オブジェクトの場合は、この方法でデフォルトを設定する必要があります。そうしないと、すべてのキーが同じ配列インスタンスを指します。

  • のブロックではinject、ハッシュと反復の現在の値の2つの引数を取得します。これは2要素の配列で(k, v)あるため、後者を2つの変数に分解するために使用されます。

  • 最後に、キーの配列に各値を追加し、次の反復のためにハッシュ全体を返します。

于 2012-07-30T07:12:02.987 に答える
1
v.inject({­}) do |res,­ ar|
  res[ar.fir­st] ||= []
  res[ar.fir­st] << ar.la­st
  res
end
于 2012-07-30T05:39:23.700 に答える
1
v = [ ["ab","12"], ["ab","31"], ["gh","54"] ]

これにより、ハッシュが取得されます。キーは、サブ配列からの一意の最初の要素です。

h = v.inject({}) { |c,i| (c[i.first] ||= []) << i.last; c }

これにより、配列の配列形式が必要になった場合に備えて、そのハッシュが配列に戻ります。

arr = h.collect { |k,v| [k,v] }
于 2012-07-30T05:41:01.617 に答える