高木のブログ

【Ruby】バージョン番号のソート

2020/09/28

問題

文字列で表されたバージョンをソートすると正しくない結果になる
“2”と”10”では”2”の方が大きい値と判断される(“10”の”1”の部分を先に評価してしまうため)

['1.1.1', '1.2.10', '1.10.1', '1.2.2'].sort
=> ["1.1.1", "1.10.1", "1.2.10", "1.2.2"]

解決方法

文字列で表現されたバージョンを比較可能にするためのクラス(Gem::Version)を使えば解決する
(本来、Gemのバージョンを取り扱うために用意されたクラスだけど)

['1.1.1', '1.2.10', '1.10.1', '1.2.2'].sort_by{ |version| Gem::Version.new(version) }
=> ["1.1.1", "1.2.2", "1.2.10", "1.10.1"]

参考

class Gem::Version (Ruby 2.7.0 リファレンスマニュアル)


Pixela