Modus ponens
модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
|
Код AS3:
package tld.doodles.collections
{
public class Array2D
{
public static const COLUMN:Array2D = new Array2D();
public static const ROW:Array2D = new Array2D();
public function get length():uint { return this._items.length; }
public function get columns():uint { return this._columns; }
public function get rows():uint
{
return this._items.length / this._columns;
}
protected const _items:Array = [];
protected var _columns:uint;
public function Array2D() { super(); }
public static function make(columns:uint,
rows:uint = 0, array:Array = null):Array2D
{
var result:Array2D = new Array2D();
if (!array) array = [];
result._columns = columns;
array.length = Math.max(array.length, columns * rows);
result._items.push.apply(result, array);
return result;
}
public static function get(array:Array2D, x:uint, y:uint):Object
{
return array._items[x * array._columns + y];
}
public static function set(array:Array2D, x:uint, y:uint,
value:Object):Object
{
return array._items[x * array._columns + y] = value;
}
public static function insertColumns(array:Array2D,
position:uint, howMany:uint, feeder:Function):Array2D
{
var times:uint = array.rows;
for (var i:int; i < times; i++)
array._items.splice.apply(
array._items,
[position + howMany * i + array._columns * i, 0].concat(
new Array(howMany).map(feeder)));
array._columns += howMany;
return array;
}
public static function insertRows(array:Array2D,
position:uint, howMany:uint, feeder:Function):Array2D
{
array._items.splice.apply(
array._items, [position * array._columns, 0].concat(
new Array(howMany * array._columns).map(feeder)));
return array;
}
public static function forEach(array:Array2D, kind:Array2D,
callback:Function):Array2D
{
var element:Array;
var iterations:uint;
if (kind == COLUMN)
{
iterations = array._columns;
for (var i:int; i < iterations; i++)
{
callback(fetchColumn(
i, array._columns, array._items, element), i);
setColumn(array, i, element);
}
}
return array;
}
public static function setColumn(array:Array2D, column:uint,
elements:Array):Array2D
{
var arrayLength:uint = array.length;
for (var i:int; column < arrayLength; column += array._columns, i++)
array._items[column] = elements[i];
return array;
}
public static function setRow(array:Array2D, row:uint,
elements:Array):Array2D
{
elements.length = array._columns;
array._items.splice.apply(
array._items, [row * array._columns, elements.length]
.concat(elements));
return array;
}
private static function fetchColumn(offset:uint, step:uint,
source:Array, destination:Array):Array
{
destination.length = 0;
var sourceLength:uint = source.length;
for (; offset < sourceLength; offset += step)
destination.push(source[offset]);
return destination;
}
private static function fetchRow(row:uint, rowLength:uint,
destination:Array, source:Array):Array
{
var start:uint = row * rowLength;
var end:uint = start + rowLength;
destination.length = 0;
for (var j:int, i:int = start; i < end; i++, j++)
destination[j] = source[i];
return destination;
}
public static function print(array:Array2D):String
{
var filler:String;
var top:String;
var bottom:String;
var rows:Array = [];
var totalRows:uint = array.rows;
var row:Array = [];
var maxLength:uint;
var rowString:String;
var column:Array = [];
var mask:Array = [];
var columnsDestination:Array = new Array(array.rows + 1).join("│").split("");
var j:uint;
for (var i:uint; i < array._columns; i++)
{
column = fetchColumn(i, array._columns, array._items, column);
maxLength = 0;
for (j = 0; j < totalRows; j++)
{
if (i == array._columns - 1)
column[j] = rowString = " " + String(column[j]);
else column[j] = rowString = " " + String(column[j]) + ",";
maxLength = Math.max(maxLength, rowString.length);
}
for (j = 0; j < totalRows; j++)
{
rowString = column[j];
mask.length = (maxLength - rowString.length) + 1;
columnsDestination[j] += rowString + mask.join(" ");
if (i == array._columns - 1)
columnsDestination[j] += " │\n";
}
}
filler = new Array(String(columnsDestination[0]).length - 2).join("─");
top = "┌" + filler + "┐\n";
bottom = "└" + filler + "┘";
return top + columnsDestination.join("") + bottom;
}
}
}
Дело было вечером, делать было... на самом деле было чего
Код AS3:
private function testArray2D():void
{
var array:Array2D = Array2D.make(4, 5);
trace(Array2D.print(array));
Array2D.setColumn(array, 2, [1, 2, 3]);
trace(Array2D.print(array));
Array2D.setRow(array, 2, [5, 6, 7]);
trace(Array2D.print(array));
Array2D.insertColumns(array, 3, 4, Math.max);
trace(Array2D.print(array));
}
Код:
┌────────────────────────────────────────────┐
│ undefined, undefined, undefined, undefined │
│ undefined, undefined, undefined, undefined │
│ undefined, undefined, undefined, undefined │
│ undefined, undefined, undefined, undefined │
│ undefined, undefined, undefined, undefined │
└────────────────────────────────────────────┘
┌────────────────────────────────────────────┐
│ undefined, undefined, 1, undefined │
│ undefined, undefined, 2, undefined │
│ undefined, undefined, 3, undefined │
│ undefined, undefined, undefined, undefined │
│ undefined, undefined, undefined, undefined │
└────────────────────────────────────────────┘
┌────────────────────────────────────────────┐
│ undefined, undefined, 1, undefined │
│ undefined, undefined, 2, undefined │
│ 5, 6, 7, undefined │
│ undefined, undefined, undefined, undefined │
│ undefined, undefined, undefined, undefined │
└────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────────────┐
│ undefined, undefined, 1, NaN, NaN, NaN, NaN, undefined │
│ undefined, undefined, 2, NaN, NaN, NaN, NaN, undefined │
│ 5, 6, 7, NaN, NaN, NaN, NaN, undefined │
│ undefined, undefined, undefined, NaN, NaN, NaN, NaN, undefined │
│ undefined, undefined, undefined, NaN, NaN, NaN, NaN, undefined │
└────────────────────────────────────────────────────────────────┘
__________________
Hell is the possibility of sanity
Последний раз редактировалось wvxvw; 23.01.2012 в 04:10.
|