9

私は単純な配列を持っています

array = ["apple", "orange", "lemon"] 

array2 = [["apple", "good taste", "red"], ["orange", "bad taste", "orange"], ["lemon" , "no taste", "yellow"]]

配列内の要素がarray2内の各要素の最初の要素と一致するたびに、このハッシュに変換するにはどうすればよいですか?

hash = {"apple" => ["apple" ,"good taste", "red"],
        "orange" => ["orange", "bad taste", "orange"], 
        "lemon" => ["lemon" , "no taste", "yellow"] }

私はルビーにまったく慣れておらず、この操作を行うために多くの時間を費やしていますが、運が悪い、助けはありませんか?

4

5 に答える 5

14

キーとペアの間のマッピングの順序が の最初の要素に基づくarray2必要がある場合は、まったく必要ありませんarray

array2 = [
  ["apple", "good taste", "red"],
  ["lemon" , "no taste", "yellow"],
  ["orange", "bad taste", "orange"]
]

map = Hash[ array2.map{ |a| [a.first,a] } ]
p map
#=> {
#=>   "apple"=>["apple", "good taste", "red"],
#=>   "lemon"=>["lemon", "no taste", "yellow"],
#=>   "orange"=>["orange", "bad taste", "orange"]
#=> }

array要素のサブセットを選択するために使用する場合は、次のようにします。

# Use the map created above to find values efficiently
array = %w[orange lemon]
hash  = Hash[ array.map{ |val| [val,map[val]] if map.key?(val) }.compact ]
p hash
#=> {
#=>   "orange"=>["orange", "bad taste", "orange"],
#=>   "lemon"=>["lemon", "no taste", "yellow"]
#=> }

このコードは、 が に存在しないキーを要求した場合に問題が発生しないことを保証しif map.key?(val)、時間内に要求を実行します。compactarrayarray2O(n)

于 2012-06-08T04:30:52.660 に答える
3

これにより、目的の結果が得られます。

hash = {}

array.each do |element|
  i = array2.index{ |x| x[0] == element }
  hash[element] = array2[i] unless i.nil?
end
于 2012-06-08T04:17:07.450 に答える
-1

ああ..私はrassocをオーバーライドしたい

irbで以下をチェックしてください

class Array
  def rassoc obj, place=1
    if place
      place = place.to_i rescue -1
      return if place < 0
    end

    self.each do |item|
      next unless item.respond_to? :include? 

      if place
        return item if item[place]==obj
      else
        return item if item.include? obj
      end
    end

    nil
  end
end

array = ["apple", "orange", "lemon"] 
array2 = [["apple", "good taste", "red"], ["orange", "bad taste", "orange"], ["lemon" , "no taste", "yellow"]]

Hash[ array.map{ |fruit| [fruit, array2.rassoc(fruit, nil)]}]
# this is what you want

# order changed
array2 = [["good taste", "red", "apple"], ["no taste", "lemon", "yellow"], ["orange", "bad taste", "orange"]]

Hash[ array.map{ |fruit| [fruit, array2.rassoc(fruit, nil)]}]
# same what you want after order is changed
于 2012-06-08T06:11:43.500 に答える