2016-07-28 85 views
0

我有以下散列。哈希排序alphabetiacly在红宝石

h = { 
    "31d2fcd5-aec0-438d-895c-806fd0358c23"=>{"name"=>"q", 'database'=>'mysql'}, 
    "69a05dea-d767-44b7-b40c-f76d0d12f8c1"=>{"name"=>"Qwerty", 'database'=>'H2'}, 
    "69a05dea-d767-44b7-b40c-f76d0d121993"=>{"name"=>"b", 'database'=>'postgresql'}, 
    "69a05dea-d767-44b7-b40c-f76d0d121994"=>{"name"=>"B", 'database'=>'oracle'}, 
    "69a05dea-d767-44b7-b40c-f76d0d121995"=>{"name"=>"Apple", 'database'=>'sqlite3'}, 
    "69a05dea-d767-44b7-b40c-f76d0d521996"=>{"name"=>"a", 'database'=>'mariadb'}, 
    "69a05dea-d767-44b7-b40c-f76d0d1k1996"=>{"name"=>"A", 'database'=>'mongodb'} 
} 

排序,我想看到它在下面的表格

h = { 
    "31d2fcd5-aec0-438d-895c-806fd0358c23"=>{"name"=>"a", 'database'=>'mariadb'}, 
    "69a05dea-d767-44b7-b40c-f76d0d12f8c1"=>{"name"=>"A", 'database'=>'mongodb'}, 
    "69a05dea-d767-44b7-b40c-f76d0d121993"=>{"name"=>"Apple", 'database'=>'sqlite3'}, 
    "69a05dea-d767-44b7-b40c-f76d0d121994"=>{"name"=>"b", 'database'=>'postgresql'}, 
    "69a05dea-d767-44b7-b40c-f76d0d121995"=>{"name"=>"B", 'database'=>'oracle'}, 
    "69a05dea-d767-44b7-b40c-f76d0d521996"=>{"name"=>"q", 'database'=>'mysql'}, 
    "69a05dea-d767-44b7-b40c-f76d0d1k1996"=>{"name"=>"Qwerty", 'database'=>'H2'} 
} 

在此先感谢后。

+1

当你有特定的订单要求,然后一个[哈希表](https://en.wikipedia。org/wiki/Hash_table)可能不适合你,因为散列表是一种无序的数据结构。即使Ruby的散列从版本1.9.3开始具有稳定的排序,您也不应该依赖于此,因为每次添加项目时都必须手动重新排序。 – spickermann

+0

我的红宝石版本是1.8.7 –

+0

您可能想详细说明为什么要对该散列进行排序。那么我们可能会提出一个解决方法。 – spickermann

回答

0

因为它是写在RubyDocs:

散列枚举在相应的键 插入的顺序的值。

所以,你需要为你的目的创建新的哈希:

h.to_a.sort_by{|s| s[1]['name']}.to_h 

{ 
    "69a05dea-d767-44b7-b40c-f76d0d1k1996"=>{"name"=>"A", "database"=>"mongodb"}, 
    "69a05dea-d767-44b7-b40c-f76d0d121995"=>{"name"=>"Apple", "database"=>"sqlite3"}, 
    "69a05dea-d767-44b7-b40c-f76d0d121994"=>{"name"=>"B", "database"=>"oracle"}, 
    "69a05dea-d767-44b7-b40c-f76d0d12f8c1"=>{"name"=>"Qwerty", "database"=>"H2"}, 
    "69a05dea-d767-44b7-b40c-f76d0d521996"=>{"name"=>"a", "database"=>"mariadb"}, 
"69a05dea-d767-44b7-b40c-f76d0d121993"=>{"name"=>"b", "database"=>"postgresql"}, 
"31d2fcd5-aec0-438d-895c-806fd0358c23"=>{"name"=>"q", "database"=>"mysql"} 
} 
+0

我不相信会产生OP要求的命令。 – Seth

+0

Mikhail Chuprynski您的书面代码正在使用ruby在线编辑器,但不适用于我的电脑。顺便说一下,我的红宝石版本是1.8.7。 –

+1

@KhachaturSaribekyan你可以使用哈希[h.to_a.sort_by {| s | s [1] ['name']}]' –

4

简短的回答:不能。请参阅文档hashes in Ruby 1.8.7

您使用键或值遍历散列的顺序看起来可能是任意的,并且通常不会处于插入顺序中。

在Ruby 1.8.7中,散列没有排序。甚至不保证该顺序与键的插入顺序相匹配(就像在Ruby 1.9+中一样)。这样说:你将不得不使用不同的数据结构,例如数组。数组可以按其第一个值进行排序,并保持该顺序。

顺便说一句:Ruby 1.8.7已经过时了很多年了(它的继任者Ruby 1.9 was released six years ago)。 Ruby 1.8.7缺少一些有趣的功能,不再获得安全更新,许多宝石放弃了对这个旧版本的支持。我建议更新到至少红宝石2.2+

0

对于红宝石v.1.9.3 +,

h.sort_by { |_,v| [v["name"][0].downcase, v["name"]] }.to_h 
    #=> {"69a05dea-d767-44b7-b40c-f76d0d1k1996"=>{"name"=>"A", "database"=>"mongodb"}, 
    # "69a05dea-d767-44b7-b40c-f76d0d121995"=>{"name"=>"Apple", "database"=>"sqlite3"}, 
    # "69a05dea-d767-44b7-b40c-f76d0d521996"=>{"name"=>"a", "database"=>"mariadb"}, 
    # "69a05dea-d767-44b7-b40c-f76d0d121994"=>{"name"=>"B", "database"=>"oracle"}, 
    # "69a05dea-d767-44b7-b40c-f76d0d121993"=>{"name"=>"b", "database"=>"postgresql"}, 
    # "69a05dea-d767-44b7-b40c-f76d0d12f8c1"=>{"name"=>"Qwerty", "database"=>"H2"}, 
    # "31d2fcd5-aec0-438d-895c-806fd0358c23"=>{"name"=>"q", "database"=>"mysql"}} 

如何红宝石订单阵列的解释,它决定查看该文档的第三段为Array#<=>他们排序的顺序。

我的结果不同于你的二次分拣。你的主排序是

["q", "Qwerty", "b", "B", "Apple", "a", "A"].sort_by { |s| s[0].downcase } 
    #=> ["a", "Apple", "A", "B", "b", "q", "Qwerty"] 

这是很好的,但你与"a""A"开始串辅助排序,你想成为

["a", "A", "Apple"] 

既不是

["a", "Apple", "A"].sort 
    # => ["A", "Apple", "a"] 

也不

["a", "Apple", "A"].sort.reverse 
    #=> ["a", "Apple", "A"] 

所以这引出了一个问题,“你的第二分类标准是什么?”?