При проектировании структуры данных для таких задач проще начать с определения интерфейса для SpreadSheet. Как только все операции (операции чтения, операции создания, операции изменения и удаления) будут определены, требуемые характеристики (последовательный доступ, прямой доступ и т. Д.) Структуры данных станут очевидными.
В электронной таблице необходимы механизмы прямого доступа к столбцам, строкам или ячейкам с использованием индексов / имен, которые вызывают карту. Также потребуется последовательный доступ (итерация) по строкам и столбцам, который вызывает список. Итак, интерфейс MapList - это то, что вам нужно. Теперь нам нужно выбрать реализацию. Поскольку удаление может происходить в любом месте в списке строк или столбцов, реализация LinkedList кажется наилучшей. Это также позволило бы операции с постоянным временем для реорганизации списка. Подводя итог, LinkedListMap будет лучшим выбором для строк и столбцов.
класс SpreadSheet:
LinkedListMap<String,Row> rows;
// RowKey --> Row. Row has data. This allows direct access and looping.
LinkedListMap<String,Col> cols;
//only metadata - name,sort status, visible/invisible...
//This allows direct access and looping.
класс Ряд:
LinkedListMap<String,Cell> cells; //colKey --> cell
//This allows direct access and looping.
класс ячейки:
Object value;
EType dataType; //enum for data type
класс Col:
String name;
ESortState sortState; //ASC, DESC, NONE
boolean visible;
Чтобы получить доступ к определенной ячейке из листа:
rows.get(rowKey).getValue(cells.get(colKey).getName())
С указанными выше структурами данных вы сможете легко реализовать даже сложные операции, такие как получение электронной таблицы (прямоугольное выделение).