Какую структуру данных использовать в моем примере

Я хотел бы создать компонент, которые состоят из платы и ее окружающего угла. Размер платы (и поэтому также границы) определяется во времени выполнения. Некоторые примеры (плата ярка и граница, являются темными): сопроводительный текст http://img340.imageshack.us/img340/3862/examplegw.png

Плата состоит из объектов типа, BoardCell и граница состоят из объектов типа BorderCell. Структурой данных для платы является BoardCell [] - простая двухмерная антенная решетка.

Как я могу представить границу? Я запустил с чего-то вроде этого:

public BorderCell TopLeft       // top left corner cell
public BorderCell TopRight      // top right corner cell
public BorderCell BottomRight   // bottom right corner cell
public BorderCell BottomLeft    // bottom left corner cell
public BorderCell[] Top         // top border (without corners)
public BorderCell[] Bottom      // bottom border (without corners)
public BorderCell[] Left        // left border (without corners)
public BorderCell[] Right       // right border (without corners)

Мне не нравится это представление границы, можно ли предложить что-то лучше?

Дополнительный: я хотел бы иметь метод SetSomethingForTheCell на объекте границы:

public void SetSomethingForTheCell(...)

но с моей текущей структурой данных я не знаю, что передать в качестве параметра.

6
задан sventevit 29 June 2010 в 11:42
поделиться

6 ответов

Поскольку определить, является ли ячейка частью границы или нет, очень просто, храните ячейки один раз и проверяйте их принадлежность к границе, когда это необходимо.

Простой метод для проверки принадлежности ячейки к границе:

// assuming that the array is in row-major order...
public static bool IsInBorder(this BoardCell[,] board, int x, int y) {
    return x == board.GetLowerBound(1) || x == board.GetUpperBound(1) ||
           y == board.GetLowerBound(0) || y == board.GetUpperBound(0);
}
3
ответ дан 9 December 2019 в 20:39
поделиться

Я думаю, вы можете использовать обычный двумерный массив для представления всей доски (внутренняя доска с границей), и вы можете узнать тип каждой ячейки, находится ли она во внутренней доске или в границе, используя ее позицию (т.е. ячейки границы имеют x значение 0 или ширину -1 и y значение 0 или высоту -1)

2
ответ дан 9 December 2019 в 20:39
поделиться

Связаны ли BoardCell и BorderCell (или вы можете сделать их производными от общего базового класса)?

Если это так, вы можете использовать один массив BaseCell [,] и позволить определить различие между Board и Border по типу класса и / или должности.


В противном случае - однотонный массив для границы: `new BorderCell [2 * rows + 2 * cols + 4];

2
ответ дан 9 December 2019 в 20:39
поделиться

Я не использовал C # какое-то время, поэтому не могу дать вам конкретного ответа на C #. Однако я бы хотел, чтобы BorderCell был подклассом BoardCell (или имел общий подкласс). Как вы заявили, структура данных вашей платы будет тогда двухмерным массивом типа BoardCell. При создании экземпляра платы создайте экземпляры внутренних ячеек для обычных BoardCells и границы для BorderCells.

Если вы считаете, что вам может понадобиться перебрать границы и т. Д., Определите итератор в классе Board для каждого типа цикла (например, для углов, верхней границы, нижней границы и т. Д.) С помощью оператора yield.

Что касается вашего public void SetSomethingForTheCell (...) , вместо этого я бы предоставил средство доступа / свойства для элементов ячейки. Например:

BoardCell cell = board.getCell(i,j);
cell.setSomething(data)
2
ответ дан 9 December 2019 в 20:39
поделиться

Я был бы склонен определить общий интерфейс или базовый класс для BoardCell и BorderCell (т.е. Cell?) и держать их в (большем) двумерном массиве. Таким образом, вы сможете легко обращаться к каждой ячейке, и будет довольно просто определить, является ли адрес границей или доской.

2
ответ дан 9 December 2019 в 20:39
поделиться

Вы можете создать, как сказано выше, базовый класс с именем Cell (или около того) и наследовать от него. Например:

BoardCell is a cell with 3 values: x, y, bool isBorder
Board is a cell with 3 values: x, y, array Cells
1
ответ дан 9 December 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: