2013-04-30 69 views
2

所以我有这个哈希。它看起来像这样:如何将这些散列给红宝石给这些键?

{ 
    'arg0' => '126150656000', 
    'arg1' => 'Intel(R) Core(TM) i7-2640M CPU @ 2.80GHz', 
    'arg2' => '2790', 
    'arg3' => '3276320768', 
    'arg4' => '8467496960', 
    'arg5' => 'Windows 7', 
    'arg6' => '6.1', 
    'arg7' => 'amd64', 
    'arg8' => '2', 
    'arg9' => '1920', 
    'arg10' => '1200', 
    'arg11' => '32', 
} 

哈希需要被变换成基于密钥的“ARGN”位置的位置参数的个数的阵列。像这样。

[ 
    '126150656000', 
    'Intel(R) Core(TM) i7-2640M CPU @ 2.80GHz', 
    '2790', 
    '3276320768', 
    '8467496960', 
    'Windows 7', 
    '6.1', 
    'amd64', 
    '2', 
    '1920', 
    '1200', 
    '32' 
] 

这里的目标是[0] == ['arg0'][1] == ['arg1'][N] == ['argN']

注:

钥匙无法保证是正确的顺序。例如上面的散列可能在''arg4'之前有'arg9'“。对不起,没有说清楚。

+0

我认为你的散列可能不会像你的例子那样被排序?那么这将是微不足道的。 – squiguy 2013-04-30 22:49:14

+0

你是对的。按照上面的例子,哈希不能期望有键。 – 2013-04-30 22:51:45

回答

5
h.sort_by { | a, _ | a.gsub(/[^\d]/, '').to_i }.map(&:last) 
+0

完全有效。你摇滚。 – 2013-04-30 23:07:27

+0

我认为它仍然会 - sort_by在散列上(并且仍然)返回一个数组对。 – 2013-04-30 23:15:06

+0

@FrederickCheung我刚刚尝试过,你说得很对!我认为这会改变哈希的顺序以便排序哈希。 – 2013-04-30 23:17:06

1

第一瓦解你的哈希:

h = { 
    'arg1' => 'Intel(R) Core(TM) i7-2640M CPU @ 2.80GHz', 
    'arg3' => '3276320768', 
    'arg4' => '8467496960', 
    'arg7' => 'amd64', 
    'arg5' => 'Windows 7', 
    'arg2' => '2790', 
    'arg6' => '6.1', 
    'arg9' => '1920', 
    'arg8' => '2', 
    'arg0' => '126150656000', 
    'arg10' => '1200', 
    'arg11' => '32', 
} 

你可以这样做:

h.keys.sort.map{|k| h[k]} 
# => ["126150656000", "Intel(R) Core(TM) i7-2640M CPU @ 2.80GHz", "1200", 
#  "32", "2790", "3276320768", "8467496960", "Windows 7", "6.1", 
#  "amd64", "2", "1920"] 

更新:这是假设你希望你的关键字排序的标准排序顺序,而如果他们是从字面上'arg0''arg11',是不是你所期望的。我猜你的键实际上更有用。如果这些是你实际的键,你可以这样做:

h.keys.sort_by{|s| s[3..-1].to_i}.map{|k| h[k]} 
# => ["126150656000", "Intel(R) Core(TM) i7-2640M CPU @ 2.80GHz", "2790", 
#  "3276320768", "8467496960", "Windows 7", "6.1", "amd64", "2", "1920", 
#  "1200", "32"] 
+0

10和11处于错误的位置。 – 2013-04-30 22:57:08

+0

这种排序会将arg1放在arg10和arg11旁边(因为它只是一个字符串排序),就像结果显示的那样。 – 2013-04-30 22:57:09

+0

@undur_gongor感谢您指出。我假设那些假钥匙和真正的钥匙会按照期望的顺序排序。我更新了我的答案,以防这些是实际的钥匙。 – 2013-04-30 23:08:47

0

提供的答案是好的,如果哈希包含的无序键。根据你的例子,看起来他们已经订购了。如果是这种情况,那么你所需要做的就是{} .values来获得值的“有序”数组。

+0

他们并不总是为了。 – 2013-04-30 23:07:46