70


要素として文字列と数字が混在している配列があります。 これをすべて数字順に並べ替えたいのですが、どうしたらよいでしょうか？

たとえば、以下のような配列があったとします。

[code]

    ["123", 200, "12", 85]
    
[/code]

これを次のように並び替えたいです。

[code]

    ["12", 85, "123", 200]
    
[/code]


CC BY-SA 3.0
2014-09-29T20:06:18.613
69
2015-01-25T20:33:15.580
2014-10-02T01:17:50.717
30
85
question
ruby
Rubyで文字列と数字が混在している配列をソートする方法を教えてください


`sort_by`メソッドを使えばソートできますよ。

[code]

    ["123", 200, "12", 85].sort_by{|item| item.to_i} #=> ["12", 85, "123", 200]
    
[/code]

次のように書いても同じです。

[code]

    ["123", 200, "12", 85].sort_by(&:to_i) #=> ["12", 85, "123", 200]
    
[/code]


CC BY-SA 3.0
2014-09-29T20:10:36.950
70
2014-09-29T20:10:36.950
85
69
answer


私は[Kernel#Integer](http://docs.ruby-lang.org/ja/2.1.0/class/Kernel.html#M_-
INTEGER)を使うのが好きです。

[code]

    ["123", 200, "12", 85, "dog", -5].sort_by{|item| item.to_i}
    #=> [-5, "dog", "12", 85, "123", 200] >_<
    
    ["123", 200, "12", 85, "dog", -5].sort_by{|item| Integer(item)}
    # ArgumentError: invalid value for Integer(): "dog"
    
    ["123", 200, "12", 85, -5].sort_by{|item| Integer(item)}
    #=> [-5, "12", 85, "123", 200]
    
[/code]

次のように書いても同じです。

[code]

    ["123", 200, "12", 85, -5].sort_by(&method(:Integer)) #=> [-5, "12", 85, "123", 200]
    
[/code]

([Object#methodのドキュメント](http://docs.ruby-
lang.org/ja/2.1.0/class/Object.html#I_METHOD))


CC BY-SA 3.0
2014-12-16T12:40:43.050
1759
2014-12-16T13:34:19.657
2014-12-16T13:34:19.657
30
3873
69
answer


数値にマップして比較するのではなく、文字列にマップして比較する方法も考えられます。

[code]

    ary = ["123", 'cat', 200, "12", 85, nil, 'dog']
    
    p ary.sort {|a, b| format('%10s', "#{a}") <=> format('%10s', "#{b}")}
    p ary.sort_by {|x| format('%10s', "#{x}")}
    
    p ary.sort_by {|x| x.to_i}   # 数値にマップ 
    
[/code]

実行結果は次のようになります。

[code]

    [nil, "12", 85, "123", 200, "cat", "dog"]
    [nil, "12", 85, "123", 200, "cat", "dog"]
    ["dog", "cat", nil, "12", 85, "123", 200]
    
[/code]


CC BY-SA 3.0
2014-12-16T14:27:47.313
1786
2015-01-25T20:33:15.580
2015-01-25T20:33:15.580
2987
2987
69
answer