ruby中数组的多字段排序
我有这样一个数组:ruby中数组的多字段排序,ruby,algorithm,sorting,hash,Ruby,Algorithm,Sorting,Hash,我有这样一个数组: - {"name"=>“A”, "10"=>30, "2" =>40, "90"=>0} {"name"=>“B”, "10"=>20, "2" =>40, "90"=>0} {"name"=>“C”, "10"=>20, "2" =>40, "90"=>10} --- 我想首先按最高键(90)排序: 然后按下一个较高的键(10,按数字顺序)排序:
-
{"name"=>“A”, "10"=>30, "2" =>40, "90"=>0}
{"name"=>“B”, "10"=>20, "2" =>40, "90"=>0}
{"name"=>“C”, "10"=>20, "2" =>40, "90"=>10}
---
我想首先按最高键(90)排序:
然后按下一个较高的键(10,按数字顺序)排序:
然后按下一个更高的键2排序:
我如何在ruby中实现它
---
更新:
未定义键,例如,它可以是50、10、2。但它会从最高到最低排序
我知道是否定义了键(例如):
结束
我们可以这样做,但不知道如果键未定义,我该怎么做(比如,我可以在排序中进行迭代吗?)
所以,总的来说,我想按从高到低的所有数值进行排序
- 与示例中一样,
的所有元素(散列)具有相同的键李>arr
、A
和B
都是文字(例如字符串或符号),因此我将它们改为C
,“A”
,“B”
;及“C”
- 通过“…按最高键…”您的意思是“…按除
以外的键,该键在转换为整数后最大…”。而'name'
,10>2#=>true
“10”>“2”#=>false
arr = [{ "name"=>"A", "10"=>30, "2" =>40, "90"=>0 },
{ "name"=>"B", "10"=>20, "2" =>40, "90"=>0 },
{ "name"=>"C", "10"=>20, "2" =>40, "90"=>10 }]
这是执行排序的一种方法
keys = (arr.first.keys - ["name"]).sort_by(&:to_i).reverse
#=> ["90", "10", "2"]
arr.sort_by { |h| h.values_at(*keys) }
#=> [{"name"=>"B", "10"=>20, "2"=>40, "90"=>0},
# {"name"=>"A", "10"=>30, "2"=>40, "90"=>0},
# {"name"=>"C", "10"=>20, "2"=>40, "90"=>10}]
例如,sort\u By
对arr[0]
的块计算是
{ "name"=>"A", "10"=>30, "2" =>40, "90"=>0 }.values_at(*keys)
#=> { "name"=>"A", "10"=>30, "2" =>40, "90"=>0 }.values_at("90", "10", "2")
#=> [0, 30, 40]
有关如何比较相同大小的数组的说明,请参见(第3段)。另请参见。我认为
- 与示例中一样,
的所有元素(散列)具有相同的键李>arr
、A
和B
都是文字(例如字符串或符号),因此我将它们改为C
,“A”
,“B”
;及“C”
- 通过“…按最高键…”您的意思是“…按除
以外的键,该键在转换为整数后最大…”。而'name'
,10>2#=>true
“10”>“2”#=>false
arr = [{ "name"=>"A", "10"=>30, "2" =>40, "90"=>0 },
{ "name"=>"B", "10"=>20, "2" =>40, "90"=>0 },
{ "name"=>"C", "10"=>20, "2" =>40, "90"=>10 }]
这是执行排序的一种方法
keys = (arr.first.keys - ["name"]).sort_by(&:to_i).reverse
#=> ["90", "10", "2"]
arr.sort_by { |h| h.values_at(*keys) }
#=> [{"name"=>"B", "10"=>20, "2"=>40, "90"=>0},
# {"name"=>"A", "10"=>30, "2"=>40, "90"=>0},
# {"name"=>"C", "10"=>20, "2"=>40, "90"=>10}]
例如,sort\u By
对arr[0]
的块计算是
{ "name"=>"A", "10"=>30, "2" =>40, "90"=>0 }.values_at(*keys)
#=> { "name"=>"A", "10"=>30, "2" =>40, "90"=>0 }.values_at("90", "10", "2")
#=> [0, 30, 40]
有关如何比较相同大小的数组的说明,请参见(第3段)。另请参见。是,您可以在
排序依据中迭代:
# first sort the arbitrary integer keys in reverse order (assuming those keys will be same across all hashes)
keys = a[0].
keys. # ["name", "10", "2", "90"]
select { |k| k.match?(/^\d+$/) }. # this will basically keep only the integer valued strings: ["10", "2", "90"]
sort_by(&:to_i). # this will sort them by their integer values: ["2", "10", "90"]
reverse # ["90", "10", "2"]: this is the order by which you want to sort the hashes
# now use this ordered `keys` to sort the hashes by corresponding values
a.sort_by { |p| keys.map { |x| p[x] } }.reverse
是的,您可以在排序依据中迭代:
# first sort the arbitrary integer keys in reverse order (assuming those keys will be same across all hashes)
keys = a[0].
keys. # ["name", "10", "2", "90"]
select { |k| k.match?(/^\d+$/) }. # this will basically keep only the integer valued strings: ["10", "2", "90"]
sort_by(&:to_i). # this will sort them by their integer values: ["2", "10", "90"]
reverse # ["90", "10", "2"]: this is the order by which you want to sort the hashes
# now use this ordered `keys` to sort the hashes by corresponding values
a.sort_by { |p| keys.map { |x| p[x] } }.reverse
欢迎来到SO。请花点时间阅读。重要的一点是:您应该演示为解决问题而编写的代码。按键“10”排序的代码没有按预期排序。您想要三个单独的排序,还是按优先级降序对所有三个键进行单个排序?键始终是“90”、“10”和“2”,还是它们是任意的?@moveson按键排序“10”正是预期的辅助排序键。但是,关于键名的问题是有效的。请注意,“name”键的值无效。它们应该是弦吗?您想按数字排序吗?如果是,为什么这些键是字符串?您的问题不清楚:'10'
为什么是'90'
之后的下一个最高键<代码>'2'
大于'10'
!另外,'name'
是高于还是低于'2'
?为什么?此外,即使这与问题的答案无关,您也应该定义A
、B
和C
,或者(首选)用文字替代它们,这样,想回答您问题的人就可以复制并粘贴您的测试用例,而不是每个试图回答您问题的人都必须反复思考A
、B
和C
可能是什么。欢迎光临。请花点时间阅读。重要的一点是:您应该演示为解决问题而编写的代码。按键“10”排序的代码没有按预期排序。您想要三个单独的排序,还是按优先级降序对所有三个键进行单个排序?键始终是“90”、“10”和“2”,还是它们是任意的?@moveson按键排序“10”正是预期的辅助排序键。但是,关于键名的问题是有效的。请注意,“name”键的值无效。它们应该是弦吗?您想按数字排序吗?如果是,为什么这些键是字符串?您的问题不清楚:'10'
为什么是'90'
之后的下一个最高键<代码>'2'
大于'10'
!另外,'name'
是高于还是低于'2'
?为什么?此外,即使这与问题的答案无关,您也应该定义A
、B
和C
,或者(首选)用文字替代它们,这样想回答你问题的人就可以复制粘贴你的测试用例,而不是每个试图回答你问题的人都必须一遍又一遍地弄清楚A
、B
和C
可能是什么。非常感谢你,这正是我想要的!我还想问一下,如果我想按降序排序,我如何像java一样将comparator添加到sort_中?我看到正常的方式是:arr.sort_by{a |-a[:bar]}。但这种伎俩似乎不适用于这种情况?谢谢哦,找到使用反向函数的方法。这会按照转换为整数的键的降序排序。这就是为什么有.reverse
。如果要按升序排序,只需删除。反转。我不懂java,所以我不能帮你回答剩下的问题。也许读者可以。非常感谢,这正是我想要的!我还想问一下,如果我想按降序排序,我如何像java一样将comparator添加到sort_中?我看到正常的方式是:arr.sort_by{a |-a[:bar]}。但这种伎俩似乎不适用于这种情况?谢谢哦,找到我们的路