2013-03-22 146 views
0

在Ruby中,我希望能有像键映射到多个值

my_hash = {:a => [b,c,h], :d => [e,f,g]..} 

,而不是 my_hash= {:a => b ,:a => c ,:a => h , :d => e , :d=> f ,:d => g }。 我不能使用数组作为值,因为我想获得值的密钥,即 my_hash.key(c)应返回一个值。 有没有人知道如何做到这一点与红宝石哈希类或有任何其他数据结构。 谢谢。

+2

任何原因,你不能映射它的其他方式? '{b =>:a,c =>:a ...}' – tjameson 2013-03-22 09:45:24

+1

颠倒你的散列! – oldergod 2013-03-22 09:47:11

+0

我可以但只是想避免代码重复。将有大约10个键映射到一个,大约相同的数字b ...所以正在寻找更好的方法! – user1484793 2013-03-22 09:48:18

回答

1

反转散列可能是你最好的选择,但是,嘿,只是踢...

class Hash 
    def key_array_with(val) 
    self.keys.select { |k| k.include?(val) }.first 
    end 
end 

h = {[:b,:c,:h] => :a, [:e,:f,:g] => :d} 
h[h.key_array_with(:c)] 
+0

谢谢!您的解决方案奏效这可能是一个愚蠢的问题,但定义的方法应该返回密钥ie [:b,:c,:h]为什么它返回:a ?? – user1484793 2013-04-02 05:40:07

+0

对不起,我不能让内联代码示例正确显示,但是当您执行h.key_array_with(:c)时,它确实会返回[:b,:c,:h]。它只返回:a当你用h [h.key_array_with(:c)]键入散列时。 – Tim 2013-04-02 23:27:49

+0

是啊..谢谢。我不小心跳过了你给出的例子的一部分。现在我明白了。谢谢 !! – user1484793 2013-04-03 05:15:52

1

你应该有相反的方向键和值。

{b => :a, c => :a, h => :a, e => :d, f => :d, g => :d, ...} 
+0

我想如果我想使用哈希,反转是我唯一的选择。但由于上述评论中所述的原因,我正在寻找一种可支持该数据结构的软件 – user1484793 2013-03-22 10:00:46