在每行上格式化数字输出4

时间:2016-05-12 18:09:10

标签: ruby

我想将数字和输出格式化为四个一组,以便它看起来像这样:

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

我做了:

def convert_to_array(str)
  arr = str.split(' ')
  new_arr = arr.sort_by(&:to_i)
  #format(new_arr.to_s)
end

def str
  string = <<-_END_
  4 6 2 14
  15 8 13 1
  10 5 9 12
  7 11 16 3
              _END_
  convert_to_array(string)
end

这个输出是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

我使用pp作为format方法:

require 'pp'

def format(input)
  string = input.to_s
  pp string
end

但是输出结果如下:

"[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\
", \"13\", \"14\", \"15\", \"16\"]"

如何将格式设置为将其分为四组,如上例所示?

2 个答案:

答案 0 :(得分:4)

您只需要在方法中添加Enumerable#each_slice即可。由于这会返回一个枚举器,因此您需要使用Enumerable#to_a

def convert_to_array(str)
  str.split.sort_by(&:to_i).each_slice(4).to_a
end

convert_to_array(string)
  #=> [["1", "2", "3", "4"],
  #    ["5", "6", "7", "8"],
  #    ["9", "10", "11", "12"],
  #    ["13", "14", "15", "16"]] 

请注意,没有参数的String#splitsplit(/\s+/)相同。

显示结果:

convert_to_array(string).each { |a| puts a.join(' ') }
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

有关

string
  #=> "    4 6 2 14\n    15 8 13 1\n    10 5 9 12\n    7 11 16 3\n"

我们计算

a = string.split
  #=> ["4", "6", "2", "14", "15", "8", "13", "1",
  #    "10", "5", "9", "12", "7", "11", "16", "3"] 
b = a.sort_by(&:to_i)
  #=> ["1", "2", "3", "4", "5", "6", "7", "8", "9",
  #    "10", "11", "12", "13", "14", "15", "16"] 
c = b.each_slice(4)
  #=> #<Enumerator: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
  #                  "11", "12", "13", "14", "15", "16"]:each_slice(4)> 
c.to_a
  #=> [["1", "2", "3", "4"],
  #    ["5", "6", "7", "8"],
  #    ["9", "10", "11", "12"],
  #    ["13", "14", "15", "16"]] 

答案 1 :(得分:2)

您可以使用each_slice

def put_slices(array)
  array.each_slice(4) do |slice|
    puts slice.join(' ')
  end
end

put_slices(str)