
Код AS3:
package
{
import flash.display.Sprite;
public class PrintColumns extends Sprite
{
/**
* http://stackoverflow.com/questions/1...-into-x-colums
*/
public function PrintColumns()
{
super();
trace(printColumns([1, 2, 3, 4, 5, 6, 7, 8, 9], 4));
}
private function printArray(source:Array):String
{
return source.join(" ") + "\n";
}
private function printColumns(source:Array, numColumns:int):String
{
var output:String = "";
var columns:Array = new Array(numColumns);
var printPositions:Array = new Array(numColumns);
var printed:Array;
var i:int;
var columnLength:int = Math.ceil(source.length / numColumns);
var printedAlready:int;
var nextBunch:int;
printPositions[0] = 0;
while (i < numColumns)
{
if (source.length - (printedAlready + columnLength) < numColumns - i)
nextBunch = columnLength - 1;
else nextBunch = columnLength;
printPositions[i + 1] = printedAlready + nextBunch;
columns[i] = printPositions[i + 1] - printPositions[i];
printedAlready += nextBunch;
i++;
}
i = 0;
printed = new Array(numColumns);
while (i < columnLength)
{
for (var j:int = 0; j < numColumns; j++)
{
if (columns[j])
{
printed[j] = source[printPositions[j]];
printPositions[j]++;
columns[j]--;
}
else printed[j] = " ";
}
output += printArray(printed);
i++;
}
return output;
}
}
}
По поводу примера, ну вот, собственно, смысл тот же, что и у silin'a и работает так же. В распечатке получаем:

Код:
1 4 7 9
2 5 8
3 6
а хотелось бы:

Код:
1 4 6 8
2 5 7 9
3
т.е. чтобы только одна колонка максимум, отличалась по высоте от других.
ПС. Алгоритм такой потому что это адаптация со списков, и не хотелось во время распечаток много памяти ис пользовать. Но разница не существенная.