6
array = Array.new(10) { Array.new(10 , 0)}

array.each { |x| print x }

10 の 1 行を印刷し[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]ます。

に変更printすると、ページの下putsに 1000が表示されます。

「[]」と「,」を使用せずに、各配列を別の行に出力するにはどうすればよいですか?

何かのようなもの:

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
4

4 に答える 4

11

仮定する:

arr = Array.new(10) { (0..20).to_a.sample(10) }

それで

puts arr.map { |x| x.join(' ') }
1 9 6 15 7 19 18 3 0 12
13 20 18 15 0 3 19 1 14 16
7 16 5 3 12 19 4 9 20 10
6 10 9 1 18 17 7 19 5 15
12 3 8 16 10 5 2 18 20 6
12 9 0 18 2 11 16 8 7 15
8 9 14 19 3 16 6 20 13 17
7 19 16 14 13 6 9 2 3 5
10 17 8 15 11 2 13 14 16 7
14 9 20 17 15 3 4 2 11 19

あまり魅力的ではありません。もっと楽しいことをするために、次のようなことを非常に簡単に行うことができます。

width = arr.flatten.max.to_s.size+2
  #=> 4
puts arr.map { |a| a.map { |i| i.to_s.rjust(width) }.join }
   1   9   6  15   7  19  18   3   0  12
  13  20  18  15   0   3  19   1  14  16
   7  16   5   3  12  19   4   9  20  10
   6  10   9   1  18  17   7  19   5  15
  12   3   8  16  10   5   2  18  20   6
  12   9   0  18   2  11  16   8   7  15
   8   9  14  19   3  16   6  20  13  17
   7  19  16  14  13   6   9   2   3   5
  10  17   8  15  11   2  13  14  16   7
  14   9  20  17  15   3   4   2  11  19

画面に表示する列が多すぎる場合は、次のようにすることができます。

puts arr.map { |a| a.map { |i| i.to_s.rjust(width) }.join.tinyfy }
    1 9 6 15 7 19 18 3 0 12
   13 20 18 15 0 3 19 1 14 16
    7 16 5 3 12 19 4 9 20 10
    6 10 9 1 18 17 7 19 5 15
   12 3 8 16 10 5 2 18 20 6
   12 9 0 18 2 11 16 8 7 15
    8 9 14 19 3 16 6 20 13 17
    7 19 16 14 13 6 9 2 3 5
   10 17 8 15 11 2 13 14 16 7
   14 9 20 17 15 3 4 2 11 19
于 2014-12-05T19:55:51.897 に答える
3

列間に間隔を空けて 2 次元配列を出力する

to_s メソッド (strings integers floats and booleans..) とオプションのマージン幅整数を持つオブジェクトの 2 次元配列を受け入れます。

更新:さまざまな長さの配列で動作するようになりました。

def print_table(table, margin_width = 2)
  # the margin_width is the spaces between columns (use at least 1)

  column_widths = []
  table.each do |row|
    row.each.with_index do |cell, column_num|
      column_widths[column_num] = [column_widths[column_num] || 0, cell.to_s.size].max
    end
  end

  puts (table.collect do |row|
    row.collect.with_index do |cell, column_num|
      cell.to_s.ljust(column_widths[column_num] + margin_width)
    end.join
  end)
end

注: puts ステートメントの後の括弧は必須であるためtable.collectdo endブロックは 2 つの別個のパラメーターとして puts メソッドに渡されません。

例の表

my_table = [
  ["1", "Animal", "Dog", "1"],
  [1, "Animal", "Cat", "2"],
  [1, "Animal", "Bird", "3"],
  [2, "Place", "USA", "1"],
  [2.5, "Place", "Other", "2"],
  [3, "Color", "Red"],
  [3, "Color", "Blue", "b"],
  [3, "Some more color", "Orange", "c"],
  [4.7, "Age", "Young", "a"],
  [4, "Age", "Middle", "b"],
  [4, "Age", "Old", "c"],
  [5, "Alive"],
  [],
  [5, "Alive", false, "n"]
]

print_table my_table

版画:

1    Animal           Dog     1  
1    Animal           Cat     2  
1    Animal           Bird    3  
2    Place            USA     1  
2.5  Place            Other   2  
3    Color            Red     
3    Color            Blue    b  
3    Some more color  Orange  c  
4.7  Age              Young   a  
4    Age              Middle  b  
4    Age              Old     c  
5    Alive            

5    Alive            false   n 

(色付けなし。上記の色付けは StackOverflow によって追加されました。)

于 2018-04-22T20:40:03.947 に答える