在RUBY中按字段对表进行排序

时间:2015-12-01 10:02:02

标签: ruby sorting

我需要按字段对表进行排序(升序)。

这是我的表:

    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

2 个答案:

答案 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)