文字列を降順にソートする
どうやるんだっけ? と思って直ぐに思いつかなった。
str = %w(9 7 5 8 4 6 1 3 2) # 昇順 p str.sort # 降順 p str.sort{|a, b| -(a <=> b)}
「数値じゃないとマイナス付けられない!」とか思い始めると、割とハマるようです。
計算量が気になるので、sort_byでスマートにやる方法があるといいな。
追記
教えてもらいました。ありがとうございます。
irb(main):001:0> str = %w(9 7 5 8 4 6 1 3 2) => ["9", "7", "5", "8", "4", "6", "1", "3", "2"] irb(main):002:0> str.sort.reverse => ["9", "8", "7", "6", "5", "4", "3", "2", "1"] irb(main):003:0> str.sort {|a, b| b <=> a } => ["9", "8", "7", "6", "5", "4", "3", "2", "1"]
こっちのがいいですね。
追記2
ベンチマーク取ってみた。
reverseが圧倒的に速い。
#!/usr/bin/ruby require 'benchmark' array = Array.new 100000.times { array << rand(100000).to_s } puts Benchmark::CAPTION puts Benchmark.measure { array.sort{|a, b| -(a <=> b)} } puts Benchmark.measure { array.sort{|a, b| b <=> a} } puts Benchmark.measure { array.sort.reverse }
user system total real 1.810000 1.600000 3.410000 ( 3.412642) 1.780000 1.680000 3.460000 ( 3.455054) 0.120000 0.000000 0.120000 ( 0.122285) user system total real 1.940000 1.800000 3.740000 ( 3.731432) 2.140000 1.490000 3.630000 ( 3.637516) 0.130000 0.000000 0.130000 ( 0.123693) user system total real 2.030000 1.630000 3.660000 ( 3.665698) 1.790000 1.680000 3.470000 ( 3.471341) 0.140000 0.000000 0.140000 ( 0.133935)