我有一个多维数组,如下所示:
[
[name, age, date, gender]
[name, age, date, gender]
[..]
]
我想知道根据多个条件对此数组进行排序的最佳方法...例如,我将如何根据年龄 首先然后按名称进行排序?
我正在使用sort
方法,如此:
array.sort { |a,b| [ a[1], a[0] ] <=> [ b[1], b[0] ] }
除此之外,我并不真正理解这种语法,我没有得到我期望的结果。我应该使用sort
方法吗?我应该单独比较mapping
数组的结果吗?
答案 0 :(得分:43)
您应该始终使用sort_by
进行键控排序。它不仅更具可读性,而且更多更高效。此外,为了便于阅读,我还希望再次使用destructuring bind:
ary.sort_by {|name, age| [age, name] }
答案 1 :(得分:14)
这应该可以解决问题:
array.sort { |a,b| [ a[1], a[0] ] <=> [ b[1], b[0] ] }
这是做什么的?它使用了许多Ruby习语。
sort
方法使用它们根据块的返回值比较两个元素。您可以阅读所有相关信息here。<=>
运算符。如果第一个参数小于第二个参数,则返回-1;如果它们相等则返回0;如果第一个参数大于第二个参数,则返回1。当你将它与数组一起使用时,它将逐个元素地比较数组,直到其中一个返回-1或1.如果数组相等,你将得到0。答案 2 :(得分:7)
据我了解,您希望先按年龄排序,然后如果多个记录的年龄相同,请按名称排列该子集。
这对我有用
people = [
["bob", 15, "male"],
["alice", 25, "female"],
["bob", 56, "male"],
["dave", 45, "male"],
["alice", 56, "female"],
["adam", 15, "male"]
]
people.sort{|a,b| (a[1] <=> b[1]) == 0 ? (a[0] <=> b[0]) : (a[1] <=> b[1]) }
# The sorted array is
[["adam", 15, "male"],
["bob", 15, "male"],
["alice", 25, "female"],
["dave", 45, "male"],
["alice", 56, "female"],
["bob", 56, "male"]]
这样做是先按年龄进行比较,如果年龄相同(&lt; =&gt; returs 0),则比较名称。