排序:根据Ruby中的多个条件对数组进行排序

我有一个多维数组,如下所示:

[ [name, age, date, gender] [name, age, date, gender] [..] ] 

我想知道根据多种条件对这个数组进行排序的最佳方法……例如,我将如何根据年龄 排序,然后根据名称进行排序?

我正在搞乱sort方法,如下:

 array.sort { |a,b| [ a[1], a[0] ]  [ b[1], b[0] ] } 

除此之外,我并不真正理解这种语法,我没有得到我期望的结果。 我应该使用sort方法吗? 我应该通过mapping数组来单独比较结果吗?

您应该始终使用sort_by进行键控排序。 它不仅更具可读性,而且效率更高。 此外,为了便于阅读,我还希望再次使用destructuring bind:

 ary.sort_by {|name, age| [age, name] } 

这应该是诀窍:

 array.sort { |a,b| [ a[1], a[0] ] <=> [ b[1], b[0] ] } 

那这是做什么的呢? 它使用了很多Ruby习语。

  • 首先是块,有点像回调或其他语言的匿名函数/类。 Array的sort方法使用它们根据块的返回值比较两个元素。 你可以在这里阅读所有相关信息。
  • 接下来是<=>运算符。 如果第一个参数小于第二个参数,则返回-1;如果它们相等则返回0;如果第一个参数大于第二个参数,则返回1。 当你将它与数组一起使用时,它会逐个元素地比较数组,直到其中一个返回-1或1.如果数组相等,你将得到0。

根据我的理解,您希望先按年龄排序,然后如果多个记录具有相同的年龄,请按名称排列该子集。


这对我有用

 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"]] 

这样做是先按年龄进行比较,如果年龄相同(<=>重新开始0),则比较名称。