2014-12-05 2 views
2
array = Array.new(10) { Array.new(10 , 0)} 

array.each { |x| print x } 

Распечатывает одну строку из десяти [0, 0, 0, 0, 0, 0, 0, 0, 0, 0].Печатать 2D-массив

Если бы я должен был изменить 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 

ответ

7

Пусть:

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 
+1

Мне нравится то, что вы скорректировали столбцы. – engineersmnky

+0

Метод 'tinyfy' кажется очень полезным. –

+0

Метод 'tinyfy' кажется очень полезным. Где это реализовано? Я не могу найти ссылки на него. Ради этого ответа я думаю, что было бы полезно объяснить, где этот метод, поскольку он, похоже, не является встроенным методом 'String' – engineersmnky

5

Попробуйте join:

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 
+5

альтернативно: 'путы array.map {| x | x.join ('')} ' – Stefan

2

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

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 

Это решение имеет то преимущество, что легче изменить, чем другие альтернативы, чтобы соответствовать тому, что вы хотите распечатать.