【问题标题】:How can I sort this hash given these keys in ruby?给定红宝石中的这些键,我如何对这个哈希进行排序?
【发布时间】:2013-04-30 22:41:11
【问题描述】:

所以我有这个哈希。它看起来像这样:

{
  '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']

注意:

不能保证键的顺序正确。例如,上面的哈希可能有“arg9”“在”“arg4”之前。抱歉没有说清楚。

【问题讨论】:

  • 我认为您的哈希可能尚未像您的示例中那样订购?那么这将是微不足道的。
  • 你是对的。如上例所示,不能期望 Hash 具有按顺序排列的键。

标签: ruby arrays sorting hash


【解决方案1】:
 h.sort_by { | a, _ | a.gsub(/[^\d]/, '').to_i }.map(&:last)

【讨论】:

  • 我认为它仍然会 - 哈希上的 sort_by 确实(并且仍然)返回一个对数组。
  • @FrederickCheung 我刚试过,你说的很对!我认为这会改变有序哈希的哈希顺序。
  • @undur_gongor 啊,这就解释了。很抱歉让您感到困惑。
【解决方案2】:

首先打乱你的哈希:

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"]

【讨论】:

  • 这种排序会将 arg1 放在 arg10 和 arg11 旁边(因为它只是一个字符串排序),如您的结果所示。
  • @undur_gongor 感谢您指出这一点。我假设那些是假钥匙,而真正的钥匙会按所需的顺序排序。我更新了我的答案,以防这些是实际的键。
  • @FrederickCheung 谢谢,我更新了我的答案,以防 OP 实际上有那些特定的键,这些键不能按照基本的sort 进行排序。
【解决方案3】:

如果哈希包含未排序的键,则提供的答案很好。根据您的示例,看起来它们已经订购了。如果是这种情况,那么您需要做的就是执行 {}.values 来获取值的“有序”数组。

【讨论】:

  • 它们并不总是有序的。
猜你喜欢
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 2012-12-19
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多