Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- h = {:abc => 123, :xyz => 789, :qaz => 789, :wsx => [888, 999]}
- h.fetch(:xyz) # => 789
- h.rfetch(123) # => abc
- h.rfetch(789) # => [:xyz, :qaz]
- h.rfetch(888) # => :wsx
- class BiHash
- def initialize
- @forward = Hash.new { |h, k| h[k] = [ ] }
- @reverse = Hash.new { |h, k| h[k] = [ ] }
- end
- def insert(k, v)
- @forward[k].push(v)
- @reverse[v].push(k)
- v
- end
- def fetch(k)
- fetch_from(@forward, k)
- end
- def rfetch(v)
- fetch_from(@reverse, v)
- end
- protected
- def fetch_from(h, k)
- return nil if(!h.has_key?(k))
- v = h[k]
- v.length == 1 ? v.first : v.dup
- end
- end
- b = BiHash.new
- b.insert(:a, 'a')
- b.insert(:a, 'b')
- b.insert(:a, 'c')
- b.insert(:b, 'a')
- b.insert(:c, 'x')
- puts b.fetch(:a).inspect # ["a", "b", "c"]
- puts b.fetch(:b).inspect # "a"
- puts b.rfetch('a').inspect # [:a, :b]
- puts b.rfetch('x').inspect # :c
- puts b.fetch(:not_there).inspect # nil
- puts b.rfetch('not there').inspect # nil
- h = {:abc => 123, :xyz => 789, :qaz => 789, :wsx => [888, 999]}
- h.rassoc(123) # => [:abc, 123]
- h = MyBidirectionalArray.new(:foo => 42, :bar => [:hello, :world])
- h.rfetch(:world) # => :bar
- h[:bar].shift
- h[:bar] # => [:world]
- h.rfetch(:world) # => should be nil, but how to detect this??
- class Hash
- def rfetch val
- select { |k,v| v.is_a?(Array) ? v.include?(val) : v == val }.map { |x| x[0] }
- end
- end
Add Comment
Please, Sign In to add comment