Таблица или Динамическая матрица

Программирование на Юнити.

Таблица или Динамическая матрица

Сообщение Fenrir 08 май 2012, 14:37

Подскажите пожалуйста как лучше сделать класс типа "Таблица" оно же матрица. Суть в том, что бы можно было динамически добавлять как строки так и столбцы в матрицу.

Допустим. У меня есть изначально массив (допустим типа ArrayList, так как в него можно динамически добовлять строки)
Объект1
Объект2
Объект3

А я хочу сделать класс подобный ArrayList, но с возможностью расширить количество колонок. что бы получилось и при этом я мог дополнять его как и ArrayList.
объект1 Свойство1
объект2 Свойство2
объект3 Свойство3
Аватара пользователя
Fenrir
UNIт
 
Сообщения: 52
Зарегистрирован: 08 мар 2012, 22:52
Откуда: Харьков

Re: Таблица или Динамическая матрица

Сообщение Fenrir 10 май 2012, 12:52

Ни у кого нет идей? все смотрят и проходят мимо((.. Может тогда хоть подскажете почему не пускает прикрипление System.Data к скрипту. Там есть DataTable который мне подойдет. Но не могу подключить к проэкту.
Аватара пользователя
Fenrir
UNIт
 
Сообщения: 52
Зарегистрирован: 08 мар 2012, 22:52
Откуда: Харьков

Re: Таблица или Динамическая матрица

Сообщение Guyver 10 май 2012, 12:59

ну сделайте класс ...
в нём какой нибудь private Data List<List<T>>;

определите паблик методы и проперти добавления, считывания элементов ...
всякие Get (x,y) или оператор [,] перегрузите .. + можно какие нибудь GetRow ... GetCol ...
всякие GetWidht GetHeight ..
всякие SetWidth SetHeight ..

назовите его каким нибудь DynamicMatrix ... сделайте всё это генериком ... и красната ...

п.с. ох чёт я сёдня активный и добрый ..
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

Re: Таблица или Динамическая матрица

Сообщение DDDENISSS 10 май 2012, 19:02

Синтаксис:
Используется csharp
class Grid<T> {
       
        private T[,,] grid;
        private int minX, minY, minZ;
        private int maxX, maxY, maxZ;
       
        public Grid() {
        }
        public Grid(int minX, int minY, int minZ,
                        int maxX, int maxY, int maxZ) {
                this.minX = minX;
                this.minY = minY;
                this.minZ = minZ;
               
                this.maxX = maxX;
                this.maxY = maxY;
                this.maxZ = maxZ;
               
                int sizeX = maxX-minX;
                int sizeY = maxY-minY;
                int sizeZ = maxZ-minZ;
                grid = new T[sizeZ, sizeY, sizeX];
        }
       
        public T Get(int x, int y, int z) {
                return grid[z-minZ, y-minY, x-minX];
        }
       
        public void Set(T obj, int x, int y, int z) {
                int dMinX = 0, dMinY = 0, dMinZ = 0;
                int dMaxX = 0, dMaxY = 0, dMaxZ = 0;
               
                if(x < minX) dMinX = x-minX;
                if(y < minY) dMinY = y-minY;
                if(z < minZ) dMinZ = z-minZ;
               
                if(x >= maxX) dMaxX = x-maxX+1;
                if(y >= maxY) dMaxY = y-maxY+1;
                if(z >= maxZ) dMaxZ = z-maxZ+1;
               
                IncreaseMap(dMinX, dMinY, dMinZ,
                                dMaxX, dMaxY, dMaxZ);
               
                grid[z-minZ, y-minY, x-minX] = obj;
        }
       
        private void IncreaseMap(int dMinX, int dMinY, int dMinZ,
                                     int dMaxX, int dMaxY, int dMaxZ) {
                int oldMinX = minX;
                int oldMinY = minY;
                int oldMinZ = minZ;
               
                int oldMaxX = maxX;
                int oldMaxY = maxY;
                int oldMaxZ = maxZ;
               
                T[,,] oldGrid = grid;
               
                minX += dMinX;
                minY += dMinY;
                minZ += dMinZ;
               
                maxX += dMaxX;
                maxY += dMaxY;
                maxZ += dMaxZ;
               
                int sizeX = maxX-minX;
                int sizeY = maxY-minY;
                int sizeZ = maxZ-minZ;
                grid = new T[sizeZ, sizeY, sizeX];
               
                for(int z=oldMinZ; z<oldMaxZ; z++) {
                        for(int y=oldMinY; y<oldMaxY; y++) {
                                for(int x=oldMinX; x<oldMaxX; x++) {
                                        grid[z-minZ, y-minY, x-minX] = oldGrid[z-oldMinZ, y-oldMinY, x-oldMinX];
                                }
                        }
                }
        }
       
}
 
Последний раз редактировалось DDDENISSS 10 май 2012, 20:19, всего редактировалось 1 раз.
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33

Re: Таблица или Динамическая матрица

Сообщение Tolking 10 май 2012, 19:22

посмотри dictionary
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Таблица или Динамическая матрица

Сообщение _Disa_ 22 май 2012, 12:39

Вообще-то тип контейнера выбирается исходня из методов, которые он должен реализовывать. Если быстрый поиск по ключу, то видимо что-то типа:
Синтаксис:
Используется csharp
Dictionary<T, List<T> > out_collection;


Если объект и свойста одного типа (например string или enum) и если нужно быстро добавлять и удалять элементы, то выбираем стек или очередь и пихаем в нее (Queue<List<T>>), помня, что T[0] это наш объект.

Зачем делать реализацию нового класса для динамического двумерного массива? Неужели вы на С++ никогда такое не писали?
ArShift
_Disa_
UNIт
 
Сообщения: 97
Зарегистрирован: 07 мар 2012, 09:07
Откуда: Нерезиновая
Skype: islamov_denis
  • Сайт


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13