排序都上升和下降的基础上哈希

排序都上升和下降的基础上哈希

问题描述:

的数组键我有以下阵列:排序都上升和下降的基础上哈希

[ 
    {:string=>"2:aa/", :count=>2, :char=>"a"}, 
    {:string=>"2:dd/", :count=>2, :char=>"d"}, 
    {:string=>"2:ee/", :count=>2, :char=>"e"}, 
    {:string=>"=:gg/", :count=>2, :char=>"g"}, 
    {:string=>"1:ii/", :count=>2, :char=>"i"}, 
    {:string=>"=:nnn/", :count=>3, :char=>"n"}, 
    {:string=>"1:ooo/", :count=>3, :char=>"o"}, 
    {:string=>"2:sss/", :count=>3, :char=>"s"}, 
    {:string=>"1:uuu/", :count=>3, :char=>"u"} 
] 

我想这个数组哈希进行排序由数降下来,如果数是相等的,那么我就需要根据char值对其进行升序排序。

有没有什么直接的方法可以做到这一点?

+1

对于如何红宝石订单阵列的说明,请参阅该文档为[阵列#](HTTP第三段: //ruby-doc.org/core-2.4.0/Array.html#method-i-3C-3D-3E)。 –

,而不是通过-否定的价值,你也可以使用sort有两个数组,并根据需要切换的元素。

排序升/降你会使用:(见Array#<=>

ary.sort { |a, b| [a[:count], a[:char]] <=> [b[:count], b[:char]] } 

排序升/降,您切换的第一要素:

ary.sort { |a, b| [b[:count], a[:char]] <=> [a[:count], b[:char]] } 
#    ^      ^
#     |       | 
#     +-------------------------+ 

排序升序/降序,你切换第二个元素:(你的想法)

ary.sort { |a, b| [a[:count], b[:char]] <=> [b[:count], a[:char]] } 
#       ^      ^
#        |       | 
#        +-------------------------+ 
+0

请注意,这种方法只是更一般化,而不是“更正确”。由于你的值是数字,[Ursus的答案](https://stackoverflow.com/a/46605143/477037)是完全正确的。 – Stefan

试试这个

a.sort_by { |item| [-item[:count], item[:char]] } 

a是你的阵列

你问了一个直接的方法,所以这里有一种方法可以去除另一个间接寻址 - 你的中间数据结构。这里假设你的散列只是达到目的的一种手段,并打算将字符串进行排序:

strings = ["2:aa/", "2:dd/", "2:ee/", "=:gg/", "1:ii/", "=:nnn/", "1:ooo/", "2:sss/", "1:uuu/"] 

strings.sort_by{ |s| x = s[/\w+/]; [-x.size, x] } 

正则表达式分离,你需要计算和排序的一部分;如果您的实际数据与示例不同,则可能需要进行调整。

(我将取代x基于什么字母代表一个更有意义的变量名)