Перебирая 2d массив в ruby, чтобы отобразить его в табличном формате? - PullRequest
3 голосов
/ 06 марта 2011

Как я могу представить 2d массив в виде таблицы в терминале, где он правильно выстраивает столбцы, как таблица?

так это выглядит так:

         1       2       3          4          5
   1 [ Infinity | 40 | 45       | Infinity | Infinity ]
   2 [ Infinity | 20 | 50       | 14       | 20 ]
   3 [ Infinity | 30 | 40       | Infinity | 40 ]
   4 [ Infinity | 28 | Infinity | 6        | 6 ]
   5 [ Infinity | 40 | 80       | 12       | 0 ]

вместо:

[ Infinity,40,45,Infinity,Infinity ]
[ Infinity,20,50,14,20 ]
[ Infinity,30,40,Infinity,40 ]
[ Infinity,28,Infinity,6,6 ]
[ Infinity,40,80,12,0 ]

Ответы [ 4 ]

1 голос
/ 19 марта 2011
a = [[Infinity, 40, 45, Infinity, Infinity],
    [Infinity, 20, 50, 14, 20 ],
    [Infinity, 30, 40, Infinity, 40 ],
    [Infinity, 28, Infinity, 6, 6 ],
    [Infinity, 40, 80, 12, 0 ]]

Пошаговое объяснение

Сначала необходимо определить ширину столбца.col_width ниже - массив, который дает ширину для каждого столбца.

col_width = a.transpose.map{|col| col.map{|cell| cell.to_s.length}.max}

Затем, это даст вам основную часть таблицы:

a.each{|row| puts '['+
 row.zip(col_width).map{|cell, w| cell.to_s.ljust(w)}.join(' | ')+']'}

Чтобы дать метки, выполните следующие действия.

puts ' '*(a.length.to_s.length + 2)+
    (1..a.length).zip(col_width).map{|i, w| i.to_s.center(w)}.join('   ')

a.each_with_index{|row, i| puts "#{i+1} ["+
    row.zip(col_width).map{|cell, w| cell.to_s.ljust(w)}.join(' | ')+
    ']'
}

Все в одном Это для ruby1.9.Небольшая модификация заставит его работать на ruby ​​1.8.

a
.transpose
.unshift((1..a.length).to_a)   # inserts column labels #
.map.with_index{|col, i|
    col.unshift(i.zero?? nil : i)   # inserts row labels #
    w = col.map{|cell| cell.to_s.length}.max   # w = "column width" #
    col.map.with_index{|cell, i|
         i.zero?? cell.to_s.center(w) : cell.to_s.ljust(w)}   # alligns the column #
}
.transpose
.each{|row| puts "[#{row.join(' | ')}]"}
1 голос
/ 07 марта 2011

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

a = [['a', 'b', 'c'], ['d', 'e', 'f']]
puts a.map{|e| "[ %s ]" % e.join(",")}.join("\n")

Edit:

Расширенный ответ на основании дополнительного запроса.

a = [
  [ "Infinity",40,45,"Infinity","Infinity" ],
  [ "Infinity",20,50,14,20 ],
  [ "Infinity",30,40,"Infinity",40 ],
  [ "Infinity",28,"Infinity",6,6 ],
  [ "Infinity",40,80,12,0 ]
]

def print_2d_array(a, cs=12)
  report = []   
  report << " " * 5 + a[0].enum_for(:each_with_index).map { |e, i|
    "%#{cs}s" % [i+1, " "]}.join("   ")
  report << a.enum_for(:each_with_index).map { |ia, i|
    "%2i [ %s ]" % [i+1, ia.map{|e| "%#{cs}s" % e}.join(" | ") ] }
  puts report.join("\n")
end

Выход

Теперь вызов print_2d_array(a) дает результат ниже. Вы можете увеличить размер столбца в зависимости от ваших требований.

                1              2              3              4              5
 1 [     Infinity |           40 |           45 |     Infinity |     Infinity ]
 2 [     Infinity |           20 |           50 |           14 |           20 ]
 3 [     Infinity |           30 |           40 |     Infinity |           40 ]
 4 [     Infinity |           28 |     Infinity |            6 |            6 ]
 5 [     Infinity |           40 |           80 |           12 |            0 ]
0 голосов
/ 06 марта 2011

Ну, если бы я делал это, я бы сказал:

require 'pp'
pp my_2d_array

Но если это домашнее задание, я полагаю, это не сработает.Возможно:

puts a.inject("") { |m, e| m << e.join(' ') << "\n" }
0 голосов
/ 06 марта 2011
a = [['a', 'b', 'c'], ['d', 'e', 'f']]
a.each {|e| puts "#{e.join ", "}\n"}

Не самый простой способ, но работает

a, b, c
d, e, f
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...