【问题标题】:How to sort given array list?如何对给定的数组列表进行排序?
【发布时间】:2019-04-11 07:53:20
【问题描述】:
list = ["HM00", "HM01", "HM010", "HM011", "HM012", "HM013", "HM014", "HM015", "HM016", "HM017", "HM018", "HM019", "HM02", "HM020", "HM021", "HM022", "HM023", "HM024", "HM025", "HM026", "HM027", "HM028", "HM029", "HM03", "HM030", "HM031", "HM032", "HM033", "HM034", "HM035", "HM036", "HM037", "HM038", "HM039", "HM04", "HM040", "HM041", "HM042", "HM043", "HM044", "HM045", "HM046", "HM047", "HM05", "HM06", "HM07", "HM08", "HM09"]

我希望将结果显示为 ["HM00","HM01","HM002"...] 但使用排序方法会给出以下结果

["HM00", "HM01", "HM010", "HM011", "HM012", "HM013", "HM014", "HM015", "HM016", "HM017", "HM018", "HM019", "HM02"]

【问题讨论】:

  • 所有值都包含“HM”还是您可能还有其他值?
  • 是包含 HM
  • 你得到这个结果是因为你的数组项是按字母数字排序的。

标签: ruby sorting natural-sort


【解决方案1】:

如果每个元素的末尾都有一个数字

list.sort_by { |item| item.scan(/\d*$/).first.to_i }

在最后匹配那个数字,取第一个(因为扫描给你一个结果数组),把它转换成整数

更简单

list.sort_by { |item| item[/\d*$/].to_i }

[] 已经参加了第一场比赛

【讨论】:

    【解决方案2】:

    有一个更通用的解决方案适用于大多数包含数字组的字符串

    number = /([+-]{0,1}\d+)/;
    
    strings = [ '2', '-2', '10', '0010', '010', 'a', '10a', '010a', '0010a', 'b10', 'b2', 'a1b10c20', 'a1b2.2c2' ]
    
    p strings.sort_by { |item| [item.split(number).each_slice(2).map {
      |x| x.size == 1 ? [ x[0], '0' ] : [ x[0], x[1] ] }].map {|y| ret = y.inject({r:[],x:[]}) { |s, z| s[:r].push [ z[0], z[1].to_r]; s[:x].push z[1].size.to_s; s }; ret[:r] + ret[:x] }.flatten
    }
    

    您可以调整number 以匹配您要使用的数字类型:整数、浮点等。

    有一些额外的代码可以按长度对相等的数字进行排序,以便“10”在“010”之前。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 2017-12-14
      • 1970-01-01
      • 2015-01-03
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多