ruby中数组进行多层排序

ruby中数组进行多层排序非常简单,例子如下:

  • sort_by

def order_weight_sort_by(string)
    string.split(" ").sort_by do |a|
        sum_a = a.split("").inject(0) { |mem, var| mem += var.to_i }
        first_number = a[0].to_i
        [a.size, sum_a, first_number]
    end.join(" ")
end
string = "56 65 74 100 99 68 86 980 90" 
p order_weight_sort_by(string )

结果是"90 56 65 74 68 86 99 100 980"

上面的方法是先将字符串变成一个由数字字符串组成的数组。然后先按照字符串的长度进行排序,再按照字符串各数字之和进行排序,最后按照字符串的第一个数字大小进行排序。

关键代码[a.size, sum_a, first_number]

当最后是一个条件数组时,sort_by会按照该条件数组的顺序依次排序。

  • sort

def order_weight_sort(string)
   string.split(" ").sort do |a, b|
       sum_a = a.split("").inject(0) { |mem, var| mem += var.to_i }
       first_number_a = a[0].to_i
       size_a = a.size

       sum_b = b.split("").inject(0) { |mem, var| mem += var.to_i }
       first_number_b = b[0].to_i
       size_b = b.size

       [size_a, sum_a, first_number_a] <=> [size_b, sum_b, first_number_b]
   end.join(" ")
end
string = "56 65 74 100 99 68 86 980 90" 
p order_weight_sort(string )

结果与上面是一样的。

关键代码[size_a, sum_a, first_number_a] <=> [size_b, sum_b, first_number_b]#

这样看起来sort_bysort简洁很多。
确实sort_by只需要一个参数,而sort需要两个参数。但他们实现多层排序是一样的,最后都是用一个条件数组来表示。

  • 区别

sort要比sort_by灵活。因为最后的排序条件还可以这样写:

[size_b, sum_a, first_number_b] <=> [size_a, sum_b, first_number_a]

这样就相当于先按长度倒序排列,然后再按照字符串各数字之和进行排序,最后再按照首个字符的大小倒序排列。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,771评论 0 33
  • 今年肯定是我一生中(一生中?)最精彩的一年了。我的這種精彩是肯定的而你們這一年的精彩生活需要你們自己去爭取我沒什麼...
    Thirtiseven阅读 217评论 0 1
  • 人类面临有三大问题,顺序错不得。先要解决人和物之间的问题,接下来要解决人和人之间的问题,最后一定要解决人和自...
    金色麦子阅读 505评论 0 0
  • 做iOS开发已经两年了, 一直没机会写博客,或者在github上记录自己的成长, 前段时间特别忙,也学到了很多东西...
    残夜孤鸥阅读 124评论 0 0
  • 苏轼《题西林壁》原诗、注释、翻译、赏析 【原文】:题西林壁⑴横看成岭侧成峰⑵,远近高低各不同⑶。不识庐山真面目⑷,...
    xcy无名阅读 575评论 0 0