У меня есть структура данных, как показано на рисунке ниже. Мне нужно быстро вычислить индекс ячеек справа или слева от выделенной группы ячеек.
Вы можете видеть в коде ниже, что я наивно перебираю ВСЕ ячейки в каждом индексе, чтобы определить, есть ли ячейка в запрошенном индексе. Это прекрасно работает, когда у меня есть несколько (сто) ячеек, но быстро ломается, когда у меня тысячи ячеек.
В этом конкретном случае выделенная группа является мобильной и может перемещаться только в индекс до или после предыдущей / следующей занятой ячейки. Поэтому groupMinX / maxX - это минимальное и максимальное значение x, которое оно может перемещать в зависимости от положения других ячеек в строке.
private var movingGroup:CellGroup; //selected group
public function getCellAtIndex(index:int):ICell
{
for each(var cell:ICell in cells)
{
if(cell.index==index)
return cell;
}
return null;
}
public function groupMinX(xPos:Number):Number
{
var index:int = xPos/cellSize;
var cellsOnLeft:Array = getAllCellsOnLeft(index-1);
if(cellsOnLeft.length > 0)
return cellsOnLeft[cellsOnLeft.length-1].x + cellSize;
return 0;
}
public function groupMaxX(xPos:Number):Number
{
var index:int = xPos/cellSize;
var cellsOnRight:Array = getAllCellsOnRight(index);
if(cellsOnRight.length > 0)
return cellsOnRight[0].x;
return (maxIndex)*cellSize;
}
private function getAllCellsOnLeft(ofIndex:int):Array
{
var index:int = 1;
var cells:Array = [];
while( ofIndex >= 0 )
{
var cell:ICell = getCellAtIndex(ofIndex);
if(cell && !movingGroup.containsCell(cell))
cells.unshift( cell );
ofIndex--;
}
return cells;
}
private function getAllCellsOnRight(ofIndex:int):Array
{
var index:int = 1;
var cells:Array = [];
while( index <= maxIndex )
{
var cell:ICell = getCellAtIndex( ofIndex + index );
if(cell && !movingGroup.containsCell(cell))
cells.push( cell );
index++;
}
return cells;
}
То, что я ищу, - это эффективный метод сканирования / отслеживания ячеек. Массив, который я перебираю, на самом деле не содержит пустых ячеек, но имеет ячейки со свойством index.