如何使用ruby中的分数对字符串列表进行最佳排序?

时间:2016-03-05 18:43:46

标签: ruby sorting fractions

获取包含英寸符号的整数英寸字符串的现有字符串列表:

['1"','1/2"','1 1/4"','1/4"','2"','1 1/8"']

是否有最好的(红宝石,优雅,使用方法,面向对象)方式在红宝石中进行排序,以便它成为

['1/4"','1/2"','1"','1 1/8"','1 1/4"','2"']

1 个答案:

答案 0 :(得分:4)

String#to_r将方便地忽略尾随垃圾(例如"):

  

解析器忽略前导空格和尾随垃圾。

'1 1/2"'这样的内容转换为可以合理比较的数字只是一个简单的问题:

s = '1 1/2"'
r = s.split.map(&:to_r).inject(:+)

将字符串拆分为多个部分,使用Rational将每个字符串转换为String#to_r,然后使用带有符号参数的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(:+) }

但我发现命名你的小逻辑片段可以澄清事情。