Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Ширина каждого столбца


Автор: amg 7.4.2007, 10:49
Требуется написать эффективную (быструю, с внятным, по возможности кратким кодом) функцию, которая принимает ссылку на таблицу (массив массивов) и возвращает массив с максимальной шириной каждого столбца. Количество элементов в строках таблицы может быть различным. Можно использовать фунцию max (из модуля List::Util, а если этого модуля нет, то и написать ее не сложно).

Эта задача, как мне кажется, имеет достаточно общий интерес (возвращаемый массив можно использовать, например, для красивой печати таблиц с сильно различной шириной колонок). А код, который ниже, в примере, мне не нравится (с внятностью точно проблемы, со скоростью, наверное, тоже).
Код

use List::Util('max');

@a = (['N','Описание', 'Количество', 'Примечание'],
['1', 'Яблоко', '5'],
['2', 'Апельсин', '', 'Грузить бочками'],
['3', 'Киви', '10']);

@max = max_width(\@a);
print "@max\n";

sub max_width {
  my $aref = shift;
  my @max;
  foreach $i (0..max(map {$#{$_}} @$aref)) {
    $max[$i] = max(map {defined && length} map {$_->[$i]} @$aref);
  }
  return @max;
}


Автор: Nab 7.4.2007, 14:53
Ну вот у меня получился вот такой код:
Код

sub max_width {
  my $aref = shift;
  my ($i, @max);
  foreach my $arr (@$aref) {
    $i = 0;
    map {$max[$i] = length if $max[$i] < length; $i++} @$arr;
  }
  return @max;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)