2009-10-19 69 views
4

比方说,我有这样的红宝石的哈希:拆分一个Ruby散列到排序键/关联值

d = {1 => 'one', 3 => 'three', 2 =>'two'} 

,我希望得到

x = [1, 2, 3] 
y = ['one', 'two', 'three'] 

就是我想要的分类x中的键和y中的对应值。我可能想使用x的自定义排序顺序。

什么是最干净,最简单的方法呢?

+0

我可能会问,为什么你有数字键,而不是数组中的哈希?或者这对你的真实数据集更有意义? – 2009-10-19 00:25:31

+0

绝对它使我的真实数据集更有意义。 – Peter 2009-10-19 00:43:52

回答

8

简单:

x,y = d.sort.transpose 

或者用自定义排序:

x,y = d.sort_by {|k,v| whatever}.transpose 
+0

你有我的投票。 – jrhicks 2009-10-19 02:44:55

+0

好的!这显然是'正确'的方式。谢谢。 – Peter 2009-10-19 02:51:08

+0

transpose = unzip ...奇怪的命名选择,但也有我的投票 – 2009-10-19 03:43:38

8

我原来的答复

x = d.keys.sort 
y = x.map {|k| d[k]} 

但你也应该看到格伦·麦克唐纳的答案

x,y = d.sort.transpose 
0
x, y = d.keys.sort{|a,b| a <=> b}.inject([]){|result, key| result << [key, d[key]]}.transpose 

...产生的那种明确的,所以你可以把它改成任何你喜欢的。