如何最好地对 ruby 中带分数的字符串列表进行排序?
How to best sort a list of strings with fractions in ruby?
获取包含英寸符号的整数和分数的现有字符串列表:
['1"','1/2"','1 1/4"','1/4"','2"','1 1/8"']
在 ruby 中是否有最好的(rubyish,优雅,方法的使用,面向对象)排序方式使其成为
['1/4"','1/2"','1"','1 1/8"','1 1/4"','2"']
String#to_r
将方便地忽略尾随垃圾(例如 "
):
The parser ignores leading whitespaces and trailing garbage.
因此,将 '1 1/2"'
之类的内容转换为可进行合理比较的数字是一件简单的事情:
s = '1 1/2"'
r = s.split.map(&:to_r).inject(:+)
将字符串拆分成多个部分,使用 String#to_r
将每个字符串转换为 Rational
,然后使用带符号参数的 Enumerable#inject
将它们相加。干净简单。
一旦有了它,排序就很简单了:
array = ['1"','1/2"','1 1/4"','1/4"','2"','1 1/8"']
rationalized = lambda { |s| s.split.map(&:to_r).inject(:+) }
sorted = array.sort_by(&rationalized)
你当然不必使用 lambda:
array.sort_by { |s| s.split.map(&:to_r).inject(:+) }
但我发现命名您的小逻辑片段可以澄清事情。
获取包含英寸符号的整数和分数的现有字符串列表:
['1"','1/2"','1 1/4"','1/4"','2"','1 1/8"']
在 ruby 中是否有最好的(rubyish,优雅,方法的使用,面向对象)排序方式使其成为
['1/4"','1/2"','1"','1 1/8"','1 1/4"','2"']
String#to_r
将方便地忽略尾随垃圾(例如 "
):
The parser ignores leading whitespaces and trailing garbage.
因此,将 '1 1/2"'
之类的内容转换为可进行合理比较的数字是一件简单的事情:
s = '1 1/2"'
r = s.split.map(&:to_r).inject(:+)
将字符串拆分成多个部分,使用 String#to_r
将每个字符串转换为 Rational
,然后使用带符号参数的 Enumerable#inject
将它们相加。干净简单。
一旦有了它,排序就很简单了:
array = ['1"','1/2"','1 1/4"','1/4"','2"','1 1/8"']
rationalized = lambda { |s| s.split.map(&:to_r).inject(:+) }
sorted = array.sort_by(&rationalized)
你当然不必使用 lambda:
array.sort_by { |s| s.split.map(&:to_r).inject(:+) }
但我发现命名您的小逻辑片段可以澄清事情。