Ruby 有点变态的排序需求求助

hexawing · 2013年04月13日 · 最后由 hexawing 回复于 2013年04月13日 · 2579 次阅读
>> %w(1 2 10 3 9 25).sort{|a,b| a <=> b}
["1", "10", "2", "25", "3", "9"]
>> %w(1 2 10 3 9 25).sort{|a,b| a.to_i <=> b.to_i}
["1", "2", "3", "9", "10", "25"]

但这种怎么搞: %w(1 2 1-1 1-10 1-3 2-5 2-11 1-1-5)

我能想到的是先把它转成数字,但这个转数字也不那么好转啊…… 写个正则倒是可以 1-1 => 100001 1-10 => 1000101-1-5 => 10000100005这样的正则写不来的说……

%w(1 2 1-1 1-10 1-3 2-5 2-11 1-1-5).sort_by {|x| x.split('-').map{|y| y.to_i} }

杠代表什么?

哎,我好像会了,不用正则……

>> "1-16-27-34".split("-").map{|p| "%05d" % p}.join
"00001000160002700034"

然后再比

>> %w(1 2 1-1 1-10 1-3 2-5 2-11 1-1-5).sort{|a,b| a.split("-").map{|p| "%05d" % p}.join <=> b.split("-").map{|p| "%05d" % p}.join}
["1", "1-1", "1-1-5", "1-3", "1-10", "2", "2-5", "2-11"]

#2 楼 @Rei 代表第一大项下面的第一小项,不是减号 #1 楼 @windwiny 您回得真快,而且比我的简单,学习了!

#4 楼 @hexawing 如果是这样的话,直接把 - 替换成小数点,再按你之前算法就可以啦。

哪个算法都好,用 sort_by 每个值只计算一次,提高效率

.......看不懂

%w(1 2 1-1 1-10 1-3 2-5 2-11 1-1-5).sort
=> ["1", "1-1", "1-1-5", "1-10", "1-3", "2", "2-11", "2-5"]

把 2-11 放到 2-5 后面?

lz 的需求是否就相当于版本号对比 如果是的话,Gem::Version 的方法可以帮到你

可以给 sort 块一个参数

#8 楼 @iBachue 这么一说确实是,我去看看…… #7 楼 @Ddl1st 对啊,第二项的第 5 项当然应该在第 11 项的前面

需要 登录 后方可回复, 如果你还没有账号请 注册新账号