Распечатать 2D массив

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

array.each { |x| print x }

Распечатывает одну строку из десяти [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],

Если бы я должен был изменить print в putsЯ тогда получу 100 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 0

4 ответа

Решение

Предположим, что:

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 
 

Попробуйте присоединиться:

array.each { |x|
 puts x.join(" ")
}
# prints:
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
0 0 0 0 0 0 0 0 0 0

Эта версия должна работать со смесью строковых целых чисел с плавающей точкой и логических значений в 2-мерном массиве и добавляет пробелы между столбцами

def print_table(table)
  margin = 2 # spaces between columns (use at least 1)

  column_widths = table.transpose.collect do |i|
    i.max do |a, b|
      a.to_s.size <=> b.to_s.size
    end.to_s.size + margin
  end

  puts table.collect{ |row|
    row.collect.with_index do |cell, i|
      cell.to_s.ljust(column_widths[i])
    end.join
  }
end

Пример таблицы

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", "a"],
  [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", true, "y"],
  [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     a
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            true    y
5    Alive            false   n

Вы можете написать свой собственный метод, чтобы сделать это. Что-то вроде:

def array_2D_print array
    array.each do |arr|
        arr.each do |item|
            print "#{item} "
        end
        print "\n"
    end
end

Если вы используете это только один раз в своем коде, вы можете также не создавать какой-либо метод:

array.each do |arr|
    arr.each do |item|
        print "#{item} "
    end
    print "\n"
end

Преимущество этого решения в том, что его легче модифицировать, чем другие альтернативы, в соответствии с тем, что вы хотите напечатать.

Другие вопросы по тегам