ハッシュを反転する

備忘録目次 - ロバの耳

h = {
	'Apple'  => 'red',
	'Banana' => 'yellow',
	'Lemon'  => 'yellow',
	'Carrot' => 'orange'
}

p h.invert
#=> {"red"=>"Apple", "orange"=>"Carrot", "yellow"=>"Banana"}
# 色がかぶっているので,その分消えている.

h2 = {}
h.each_pair {|k,v| h2[v]=k}
p h2

p h.inject({}) {|x,y| x[y[1]] = y[0]; x}
# も同じ結果になる


キーではなく値から検索する:

def get_food_by_color( h, c)
	ret = []
	h.each_pair{|k,v| ret << k if v==c}
	ret
end
def print_food_color( h, c)
	f = get_food_by_color( h, c)
	case f.size
	when 0;		p "There is no #{c} food."
	when 1;		p "#{f.join(',')} is #{c} food."
	else;		p "#{f.join(',')} are #{c} foods."
	end
end

h = {
	'Apple'  => 'red',
	'Banana' => 'yellow',
	'Lemon'  => 'yellow',
	'Carrot' => 'orange'
}
print_food_color( h, 'red')
print_food_color( h, 'blue')
print_food_color( h, 'yellow')

#=> "Apple is red food."
#=> "There is no blue food."
#=> "Lemon,Banana are yellow foods."

Hash#key(val)を使えば,任意の値を持つキーを返すけど,複数のキーが同一の値を持つ場合に,どのキーが返るかは不定らしい.