На стыке Variant и Array

  • Автор темы T1000
  • Дата начала
T

T1000

#1
Всем доброго времени суток!

Код:
	Dim TL(4)

For i=0 To 4
TL(i)=doc.GetItemValue("TL_"+Cstr(i+1))
Next
На выходе имеем примерно следующее:
TL(0)=["1162","1168","1172"]
TL(1)=["1262","138","12","1211","14"]
TL(2)=[""]
TL(3)=["22","777"]
TL(4)=["2212","774","714"]

Вопрос: как правильно написать обращение к любому из элементов?, так так запись t=TL(1)(2) не правильна.

P.S. Извините! Из-за спешки написал в "администрирование". модераторы, перенесите тему плз в "прогрпммирование"
 
T

T1000

#3
2ToxaRat
Я думаю что я Вас правильно понял, но мне нужно немного другое.
Есть обходной пример, схожий с вашим
Код:
	dim value
Dim TL(4)
Dim res

For i=0 To 4
TL(i)=doc.GetItemValue("TL_"+Cstr(i+1))
Next

' к примеру
res=TL(1)
value=res(2)
но нет ли более простой или альтернативной записи, а не "обходной маневр"?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#5
зачем создается массив?
есть хэши
и воще на понятна цель таких выкрутасов
 
T

T1000

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

2Akupaka
я так понял речь про то, почему бы не создать ровный двумерный массив с данными? (из-за формата данных)
2Imile
поясните плз что за хэши и как ими можно воспользоваться для моего вопроса.
 
13.03.2009
625
1
#7
но нет ли более простой или альтернативной записи, а не "обходной маневр"?
альтернативный вариант - обернуть в класс и создать методы доступа.
Код:
class WrappedTL
Private tl As Variant
sub new( i_tl As Variant )
...
end sub
function getElement( i As integer, j As integer)
....
end function
....
End Class
проще это или нет чем ваш маневр - вопрос открытый.
 
T

T1000

#8
2turumbay
а это мысль!!! :)
хотя можно было бы сделать и тип данных определяемый пользователем, и что-то среднее вышло бы. хотелось бы конечно найти более простой доступ к данным. поэтому на 100% поддерживаю открытость вопроса.
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#9
function getElement( i As integer, j As integer)
А завтра он напишет, что ему надо три размерности :)

я так понял речь про то, почему бы не создать ровный двумерный массив с данными?
Речь об обращении к элементам многоуровневых массивов. Только не помню, работает ли такой синтаксис с вариантами О.о давно не юзал. Чаще использую описаный выше "обходной".
 
13.03.2009
625
1
#10
А завтра он напишет, что ему надо три размерности ;)
имхо, проблемы надо решать по мере их поступления :)
тут главное локализовать источник возможных изменений.
понадобица 3 - создаст новый класс, или подкласс, или перепишет функцию на getElement( i , j , k ), или getElement( key As WrappedTLKey ) а все остальное выловит компилятор. тут как раз наличие класса рулит.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#11
поясните плз что за хэши и как ими можно воспользоваться для моего вопроса.
вопроса не было - был набор неоформленных сентенций ;)
не относящийся к задачам мне понятным
хэши Dim l List As ...
у полей есть имена, а номер ниочём не говорит...
 
Y

Yakov

#12
lmike, только не хэш, а мэп. Потому что хэш - это результат преобразования произвольных данных в данные фиксированного размера (см. метод java.lang.Object.hashCode(), преобразующий произвольные данные - объект - в данные фиксированного размера - целое число размерностью 4 байта). А здесь - отображение (сопоставление) одного значения на другое. Аналог из Java - Map<String, ?>. В LS List устроен не как HashMap в Java, а как список (аналог java.util.List) пар (тег, значение), потому что при переборе forall x in list элементы идут в порядке их добавления в list. И при произвольном доступе к элементам списка по тегам время доступа пропорционально количеству элеменов в списке. Для java.util.HashMap это время - константа (почти).
 
D

Darker

#15
Type FieldType
Values As Variant
End Type
Dim Fields List As FieldType

For i=0 To 4
Fields(i)=doc.GetItemValue("TL_"+Cstr(i+1))
Next

forall f in fields
if isArray(f.values) then
for j=0 to Ubound(f.values)
print f.values(j)
end for
end if
end forall
 

nvyush

Lotus team
22.04.2009
2 317
0
#16
На выходе имеем примерно следующее:
TL(0)=["1162","1168","1172"]
TL(1)=["1262","138","12","1211","14"]
TL(2)=[""]
TL(3)=["22","777"]
TL(4)=["2212","774","714"]
Если нет угрозы превышения лимита в 32К, можно использовать и такое:
TL = ["1162:1168:1172" : "1262:138:12:1211:14" : "" : "22:777" : "2212:774:714"]
Получать значения так:
Код:
dim v as variant
For i = 0 To Ubound TL(i)
v = Split(TL(i), ":")
For j = 0 To Ubound(v)
Print v(j)
Next
Next