Привет , всем!
Как известно изменять размерность в многомерном массиве можно только в последней размерности , а нужно во всех и с сохранением данных...
И собственно вопрос. Замена существует этому делу? Классы с коллекциями не предлагать) Очень медленно(
Вообще я когда писал аудиоплеер, то сделал свою замену коллекции. К любому эл-ту можно обращаться по индексу или ключу.
Суть в том, что сначала для повышения скорости я ограничил максимальный размер коллекции 2^15 элементами и все массивы, 3 штуки, сделал макс. размера. На одни массивы уходило 65536*3шт.*4б = 768Кбайт. И еще это умножаем на кол-во открытых плейлистов. Потом наступило прозрение. Изначально массивы - по 1024 эл-та, если когда добавляем 1025ый, то делаем redim preserve до 2048 и так далее. Правда аналогичное уменьшение я не осилил, там сложности с перестроением массива - это не быстрая операция.
В итоге, в не слишком больших плейлистах, до 1024 эл-тов, на массивы тратится в 64 раза меньше памяти, а расширение происходит не часто, поэтому особо не влияет на скорость.
Я думаю в серьезных системах используется что-то подобное. Например http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/StringBuffer.html#capacity()
Вот кстати код, хотя само по себе не заработает
' Copyright 2009, 2010 Makarov Andrey
'
' This file is part of Audica - Open Simple Audio Player.
'
' Audica is free software: you can redistribute it and/or modify
' it under the terms of the GNU General Public License as published by
' the Free Software Foundation, either version 3 of the License, or
' (at your option) any later version.
'
' Audica is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' GNU General Public License for more details.
'
' You should have received a copy of the GNU General Public License
' along with Audica. If not, see <http://www.gnu.org/licenses/>.
Option Explicit
PrivateConst MAX_ITEMS AsLong = 65536
PrivateConst EXP_QUANT AsLong = 1024 'how many items are added when expanding
Else: qError "FCollection", "Function Add", "Wrong /before/ param=", before
EndIf
EndIf
Set tblItems(tblFreeKeys(lenFreeKeys)) = obj
lenTblsLookup = lenTblsLookup + 1
Add = tblFreeKeys(lenFreeKeys) 'return key
EndFunction
''Update object
'Public Function Replace(obj As PlayItem, ByVal id As Long, Optional ByVal idtype As eplayitemidtype = PIIT_KEY, Optional ByVal key As eplayitemid = PII_NOITEM)
' If idtype = PIIT_IDX Then
' If Not inBounds(id, 0, lenTblsLookup - 1) Then Err.Raise 2, "FCollection", "No such an item=" & id
' Set tblItems(tblKeyLookup(id)) = obj
' Else
' If Not inBounds(id, 0, UITEM) Then Err.Raise 2, "FCollection", "Key is out of bounds"
' Set tblItems(id) = obj
' End If
'End Function
'Delete item by pos or key (deletion from last to first is faster)
PublicSub Remove(ByVal id AsLong, OptionalByVal getby As efcitemidtype = PIIT_IDX)
Dim i AsLong, index AsLong
If getby = PIIT_IDX Then
IfNot (id >= 0 And id <= lenTblsLookup - 1) Then Err.Raise 2, "FCollection", "No such an item=" & id
index = id 'save index
id = tblKeyLookup(id) 'get key
Else
IfNot (id >= 0 And id <= UITEM) Then Err.Raise 2, "FCollection", "Key is out of bounds"
index = tblIdxLookup(id) 'get index
EndIf
IfNot m_cust_keys Then
tblFreeKeys(lenFreeKeys) = id
lenFreeKeys = lenFreeKeys + 1
EndIf
tblIdxLookup(id) = PII_NOITEM 'index is not associated with key anymore
'do not free memory, it isn't very expensive today:)
' Set tblItems(id) = Nothing
If index < lenTblsLookup - 1 Then'not last index
For i = index + 1 To lenTblsLookup - 1
tblIdxLookup(tblKeyLookup(i)) = i - 1 'tblIdxLookup(tblKeyLookup(i)) - 1
Сенкс!
В коде я не стал разбираться...( Но на первый взгляд используются одномерные массивы ( даже в случае , что они связаны), а мне это неприемлемо. У меня предполагается около 35-40 индексов многомерного массива (т.е. это 35-40 одномерных , но мне нужны многомерные (3х размерные)) Т.е. умножаем ещё на 3... Это я умотаюсь их объявлять)) Неприемлемо!