我需要按字段对表进行排序(升序)。
这是我的表:
vTable=Text::Table.new
vTable.head= ["Value", "Rest", "NumberRun"]
我将数据存储在循环中的表中
lp= [value, rest, num]
vTable.rows << lp
完成我的表后,它看起来像:
33183 | 109 | 5.10.0.200
34870 | 114 | 5.4.1.100
28437 | 93 | 5.6.0.050
31967 | 105 | 5.6.2.500
29942 | 98 | 5.7.2.900
我想通过&#34; NumberRun&#34;来排序,升序。考虑到5.10.0.200大于5.7.2.900。
我的想法是删除&#34;。&#34;从&#34; NumberRun&#34;,将其转换为数字,然后排序。以这种方式5.10.x> 5.9.x
答案 0 :(得分:1)
您可以按以下方式对行进行排序。它使用随Ruby 1.9.2引入的Array#sort_by!()
方法。
vTable.rows.sort_by! { |_,_,num| num.split('.').map(&:to_i) }
它还使用Destructuring作为sort_by!()
的块参数。
对于早于1.9.2的Ruby版本,您可以对rows
进行排序并重新分配。
vTable.rows = vTable.rows.sort_by { |_,_,num| num.split('.').map(&:to_i) }
答案 1 :(得分:0)
我为你创建了一个可以进行比较的NumberRun类。
#number_run.rb
class NumberRun
include Comparable
attr_accessor :run_number
def initialize(str)
@run_number = str
end
def <=> str1
str_split = @run_number.split(".")
str1_split = str1.run_number.split(".")
output = 0
str_split.each_with_index do |num, index|
if((num.to_i <=> str1_split[index].to_i) != 0 && index != (str_split.count - 1))
output = (num.to_i <=> str1_split[index].to_i)
break
elsif index == (str_split.count - 1)
output = (num.to_i <=> str1_split[index].to_i)
end
end
output
end
end
举个例子:
a = [
NumberRun.new('5.10.0.200'),
NumberRun.new('5.4.1.100'),
NumberRun.new('5.6.0.050'),
NumberRun.new('5.6.2.500'),
NumberRun.new('5.7.2.900')
]
a.sort.map(&:run_number)