散列中的索引元素

时间:2014-09-11 17:36:51

标签: ruby arrays hash

让我知道我有一个哈希:

class MyHash
  H = { 1 => [1,2,3,4,5], 2 => [2,7,8,9,10] } 

  def self.get(id)
    # code
  end
end

该方法的实现如何以这种方式访问​​数据?

element = MyHash.get 1
# => [1,2]
element = MyHash.get 6
# => [2,7]
element = MyHash.get 4
# => [1,5]
element = MyHash.get 5
# => [2,2]

我可以“手动”编写方法,但也许有一种更简单的“rubyist”方法来做到这一点

1 个答案:

答案 0 :(得分:1)

你可以这样做:

H = { 1 => [1,2,3,4,5], 2 => [6,7,8,9,10] } 
HINV = H.flat_map { |k,v| [k].product(v) }
        .map.with_index { |(k,v),i| [i,[k,v]] }
        .to_h
  #=> {0=>[1, 1], 1=>[1, 2], 2=>[1, 3], 3=>[1, 4], 4=>[1, 5],
  #    5=>[2, 6], 6=>[2, 7], 7=>[2, 8], 8=>[2, 9], 9=>[2, 10]}

class MyHash
  def self.get(id)
    HINV[id]
  end
end

MyHash.get(1) #=> [1, 2]
MyHash.get(6) #=> [2, 7]
MyHash.get(4) #=> [1, 5]

但是,不需要课程MyHash

HINV[1]       #=> [1, 2]
HINV[6]       #=> [2, 7]
HINV[4]       #=> [1, 5]

如果您不希望哈希值为常数:

def invert_hash_by_values_index(h)
  Hash[h.flat_map { |k,v| [k].product(v) }
   .map.with_index { |(k,v),i| [i,[k,v]] }]
end

h = { 1 => [1,2,3,4,5], 2 => [6,7,8,9,10] } 
hinv = invert_hash_by_values_index(h)
  #=> {0=>[1, 1], 1=>[1, 2], 2=>[1, 3], 3=>[1, 4], 4=>[1, 5],
  #    5=>[2, 6], 6=>[2, 7], 7=>[2, 8], 8=>[2, 9], 9=>[2, 10]}

hinv[1] #=> [1, 0]
hinv[6] #=> [2, 0]
hinv[4] #=> [1, 3]

我在这里使用了类方法Hash::[],而不是实例方法Array#to_h,后者已经在Ruby 2.0中添加了。