2011-07-09 10 views
1

今私は345A22のように、文字と数字の両方からなるIDを発行するプロジェクトに取り組んでいます。私はこのプログラムが、たとえば345B22が345A22よりも大きいことを伝えることができるようにする必要があります。私は文字が常に同じ位置にあると仮定することはできません(つまり、私たちは22335QのIDを持っています)。しかし、2つの数字を比較すると、同じ位置に文字が配置されます。Rubyでは英数字のIDが他のIDよりも大きいと判断するにはどうすればよいですか?

これをRubyでどのように達成できますか?

答えて

3

String#<=>メソッドを使用して文字列を比較できます。ドキュメントhereを参照してください。

1戻り値が 345B22が大きいことを意味
>> "345B22" <=> "345A22"             
=> 1 

2

簡単な文字列比較ではトリック(例えば長さの違いなど)が行われない場合は、それらをすべてbase37でエンコードされたデータとして扱い、整数に変換してみてください。

1

私はあなたの質問を理解していますが、私は精神的にコンポーネントにIDを解析する(345B22は345、B、22です)と推測していますし、数字のソートを望んでいます12> 2)と文字列の文字列の並べ替え(AB < B)です。

これはあなたが意図し何であれば、以下のようなものは、トリックを行うだろう:

ids.sort_by do |id| 
    id.scan(/\d+|[a-zA-Z]+/).map {|c| c =~ /\d/ ? c.rjust(20) : c.ljust(20) }.join 
end 

これがないことは、すべての連続した数字や文字を抽出して、そのタイプに基づいてそれらを右または左に正当化されます結果を連結し、次にこの(拡張され正規化された)idに基づいてソートします。

2

Rubyの文字列には、数字と同じ比較方法があります。

2 > 1 #=> true 
"2" > "1" #=> true 
"B" > "A" #=> true 
関連する問題