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

在RUBY中,按字段对表进行排序,ruby,sorting,Ruby,Sorting,我需要按字段对表进行排序(升序) 这是我的桌子: vTable=Text::Table.new vTable.head= ["Value", "Rest", "NumberRun"] 我将数据存储在循环内的表中 lp= [value, rest, num] vTable.rows << lp 考虑到5.10.0.200大于5.7.2.900,我想按“NumberRun”对该表进行升序排序 我的想法是从“NumberRun”中删除“.”,将其转换为一

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

这是我的桌子:

    vTable=Text::Table.new
    vTable.head= ["Value", "Rest", "NumberRun"]
我将数据存储在循环内的表中

    lp= [value, rest, num]
    vTable.rows << lp
考虑到5.10.0.200大于5.7.2.900,我想按“NumberRun”对该表进行升序排序


我的想法是从“NumberRun”中删除“.”,将其转换为一个数字,然后进行排序。这样,5.10.x>5.9.x

您可以按以下方式对行进行排序。它使用Ruby 1.9.2引入的方法

vTable.rows.sort_by! { |_,_,num| num.split('.').map(&:to_i) }
它还对
sort\u by!的块参数使用解构!()

对于早于1.9.2的Ruby版本,您可以对
行进行排序
并重新分配它们

vTable.rows=vTable.rows.sort_by{| | |,|,num | num.split('.').map(&:to|i)}

我为您创建了一个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

Text::Table
来自何处?允许您创建纯文本表并设置其格式。使用它可以轻松地将格式化的表格打印到点阵式打印机。您是否尝试过
vTable.rows.sort_by{| | u,u,run | convert(run)}
?您似乎正在使用gem。我得到了这个错误->未定义的方法“sort_by!”对于#您使用什么Ruby版本?我在开始时分配了一个标准数组,
vTable.rows=[]
。aaazzzzzz可能是一个旧版本->ruby 1.8.7您尝试过我的解决方案吗?@AndreyDeineko同样的想法,不是吗?
#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)