2015-09-11 59 views
1

我遇到问题,按数组值的长度以降序排序哈希。我有以下散列:按值的长度排序哈希值(降序)

hash = { 
    "1" => [0,3], 
    "2" => [0,2], 
    "3" => [1,2,3,4], 
    "4" => [1,8,7,6,5], 
    "5" => [7,8], 
    "10" => [5] 
} 

我想按照以下顺序对它进行排序:4,3,1,2,5,10。

hash.sort_by {|k,v| v.length}.reverse 

我在做什么不对?有任何想法吗?

+0

这里工作正常! :/ – nersoh

+0

@nersoh我试着运行它,它给了我5,4,3,2,1,10虽然5只有长度为2 :( – user2765163

+0

为什么急于选择一个答案?急于判断可能会阻止其他,有时候会更好,回答,对于那些仍在准备答案的人来说,imo是无礼的,我建议至少等上几个小时,不要忘记,新成员往往没有意识到你可以对他们自己的问题的答案投票,一旦给出,可以撤销对勾或将其重新分配给不同的答案 –

回答

0

不能排序哈希 - 这可能会导致你的困惑。散列元素在数组中出现时没有“内部”排序。

可以,然而,迭代在一定的顺序散列,例如,

hash.sort_by {|k,v| v.length}.reverse.each do |k, v| 
    puts "k = #{k}, v = #{v}" 
end 
+0

应该注意,hash.sort_by的结果是一个数组而不是一个散列 – evotopid

+1

“散列的元素没有”内部“排序作为它出现在一个数组中“。这是不正确的。从1.9开始,Ruby在Hashes中实现了保持插入顺序的排序。* Hashes枚举它们的值的顺序是插入相应的键。*(直接来自[Hash文档](ht tp://ruby-doc.org/core-1.9.3/Hash.html)for 1.9.3)你清楚地表明你可以通过使用Enumerable#sort_by将它转换为一个'Enumerator'来排序一个Hash,它将返回一个关联的数组(带有一个块)。然后,该数组可以轻松地转换回散列并保留请求的排序。 – engineersmnky

+0

@engineersmnky:你说得对。无论如何,在大多数使用情况下,为了排序而创建第二个散列是不需要的,我猜。 – claasz

3

看来你正在寻找Enumerable#sort_by这样的(作注,这可能是hash.sort_by {|_,v| -v.length}.to_h取决于Ruby的版本。我用Hash[]因为它的兼容性)。

Hash[hash.sort_by {|_,v| -v.length}] 
#=> 
# { 
# "4"=>[1, 8, 7, 6, 5], 
# "3"=>[1, 2, 3, 4], 
# "1"=>[0, 3], 
# "2"=>[0, 2], 
# "5"=>[7, 8], 
# "10"=>[5] 
# } 

排序一个Hash使用Enumerable#sort_by当与块称为将返回的[[key,value],[key,value],...]关联数组(否则它返回一个Enumerator)。由于Hash了解关联Array结构,因此可以通过调用associative_array.to_h(Ruby> = 2.1)或Hash[associative_array](适用于所有Ruby版本)轻松地将此变回Hash

+1

很好的答案。丑陋的格式。 –

+0

@CarySwoveland @sawa照顾了我:)。尽管我讨厌使用'hash'作为局部变量名称,因为它已经在Object的上下文中具有一种含义 – engineersmnky