2011-10-11 8 views
15

が、私はこの配列にsortメソッドを使用する場合は、これを返すソート整数

a = ["3", "5", "8", "4", "1", "2", "9", "10", "7", "6"] 

...のは、以下に示すように、私は、1から10まで未ソート配列を持っていると言う値彼らのストリングスの配列...

a.sort = ["1", "10", "2", "3", "4", "5", "6", "7", "8", "9"] 

ご覧のとおり、10が2の前に表示されていますが、これは間違っています。これらの数字を並べ替えると、10が正しく表示されます。

編集:皆さん、ありがとうございました。私は自分の問題をもう少し詳しく説明すべきです。並べ替えが必要な配列は、eコマースの価格リストです。したがって、配列は次のようになります。

a = ["0-10", "11-20", "21-30", "31-40" etc.] 

したがって、文字列は整数に変換できません。私はこの質問を書いたときにこれを置いたはずです。私は、修正に大きな違いがあるとは思わなかった。私の間違い、私はこの仮定をすることをお詫び申し上げます!どのように配列を並べ替えることができますか?ありがとう!

+0

私はこの質問が既に回答されていると思う:ちょうどあなたの更新への回答を掲載http://stackoverflow.com/questions/1955646/sort-strings-and-numbers-in-ruby/1964686#1964686 –

+0

質問 – apneadiving

+0

すべての回答が間違った説明に基づいているので、新しい質問を投稿してください。 –

答えて

43

それは私が

a.sort_by(&:to_i) 
+0

これはレンガの答えと同じです。 'to_i'はMattの解法と比較して呼び出され、ここでも同様に適用されます。 –

+0

これは編集されたバージョンの質問も処理します。 –

+0

'&:'とは何ですか?それが私の新しい構文です。 – nipponese

6
a.sort { |a,b| a.to_i <=> b.to_i } 
+3

代わりに列挙可能な#sort_by – tokland

+0

なぜですか? sortメソッドは完全に動作します。私はsort_byを推奨する理由を知りたいと思います。 – bricker

+7

定義では、xs.sort {| a、b | a.method <=> b.method}は、xs.sort_by(&:メソッド)と完全に等価です。このタスクのために正確に設計された短い組み込み関数を持つときにsortを使う理由は何ですか?これで十分でない場合は、パフォーマンス上の理由もあります。「Ruby 1.8では、Enumerable#sort_byメソッドは組み込みのSchwartzian Transformを実装しています。鍵の計算や比較が高価な場合に便利です。 – tokland

0

安価な方法は、左にゼロを記入し、すべての数字を2桁にすることです。

+3

安価で最良の方法は、文字列ではなく整数として並べ替えることです。 – bricker

1

この動作の理由は、文字列の配列があり、適用されている並べ替えが文字列ベースであるためです。適切な数値を取得するには、文字列を数値に変換するか、最初に数値として保持する必要があります。

a = ["3", "5", "8", "4", "1", "2", "9", "10", "7", "6"] 

のではなく、このような数字:

a = [3, 5, 8, 4, 1, 2, 9, 1, 7, 6] 

あなたの配列は、このような文字列に移入されていることを理由はありますか?

+0

私の編集を参照してください、ありがとうございます – tob88

6

あなたは事前に整数にすべての文字列を変換する場合、期待どおり、それが動作するはずです:

a.map(&:to_i).sort 
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
+0

このような小さな配列では実際には関係ありませんが、to_iを半分だけ何度も呼び出している方が、大規模配列の方が高速です。 +1 – bricker

+1

@bricker Mattのメソッドは、あなたのメソッドが持たない 'map'で新しい配列を作成するので、より多くのメモリを使います。 (あなたはインプレースマップ 'map! 'を使うことができますが、それはあなたのコードで実行可能なオプションではないかもしれません) –

+0

良い点@WizardofOgz +1 – bricker

8

の考えることができる最短の方法ですので、私はそこに別の方法をスローされます更新された質問には、

array.sort_by {|elt| ary = elt.split("-").map(&:to_i).inject(&:+)} 
+2

うん!奇妙なことのためのボーナスポイント!:) – Thom