排序都上升和下降的基础上哈希
问题描述:
的数组键我有以下阵列:排序都上升和下降的基础上哈希
[
{: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值对其进行升序排序。
有没有什么直接的方法可以做到这一点?
答
,而不是通过-
否定的价值,你也可以使用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
基于什么字母代表一个更有意义的变量名)
对于如何红宝石订单阵列的说明,请参阅该文档为[阵列#](HTTP第三段: //ruby-doc.org/core-2.4.0/Array.html#method-i-3C-3D-3E)。 –