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"]
答案 0 :(得分:5)
如果每个元素的末尾都有一个数字
list.sort_by { |item| item.scan(/\d*$/).first.to_i }
最后匹配该数字,取第一个(因为扫描为您提供了结果数组),将其转换为整数
更简单
list.sort_by { |item| item[/\d*$/].to_i }
[]
已经赢得了第一场比赛
答案 1 :(得分:0)
还有一个更通用的解决方案,可用于大多数包含数字组的字符串
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”之前。