На стыке Variant и Array

Тема в разделе "Lotus - Программирование", создана пользователем T1000, 3 июн 2010.

  1. T1000

    T1000 Гость

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

    Код (Text):
        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. Извините! Из-за спешки написал в "администрирование". модераторы, перенесите тему плз в "прогрпммирование"
     
  2. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    t = doc.getitemvalues("TL_0")
    print t(2)
     
  3. T1000

    T1000 Гость

    2ToxaRat
    Я думаю что я Вас правильно понял, но мне нужно немного другое.
    Есть обходной пример, схожий с вашим
    Код (Text):
        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)
    но нет ли более простой или альтернативной записи, а не "обходной маневр"?
     
  4. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    arrayVar(i, j)?
     
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    зачем создается массив?
    есть хэши
    и воще на понятна цель таких выкрутасов
     
  6. T1000

    T1000 Гость

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

    2Akupaka
    я так понял речь про то, почему бы не создать ровный двумерный массив с данными? (из-за формата данных)
    2Imile
    поясните плз что за хэши и как ими можно воспользоваться для моего вопроса.
     
  7. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    альтернативный вариант - обернуть в класс и создать методы доступа.
    Код (Text):
    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
    проще это или нет чем ваш маневр - вопрос открытый.
     
  8. T1000

    T1000 Гость

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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    А завтра он напишет, что ему надо три размерности :)

    Речь об обращении к элементам многоуровневых массивов. Только не помню, работает ли такой синтаксис с вариантами О.о давно не юзал. Чаще использую описаный выше "обходной".
     
  10. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    имхо, проблемы надо решать по мере их поступления :)
    тут главное локализовать источник возможных изменений.
    понадобица 3 - создаст новый класс, или подкласс, или перепишет функцию на getElement( i , j , k ), или getElement( key As WrappedTLKey ) а все остальное выловит компилятор. тут как раз наличие класса рулит.
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.083
    Симпатии:
    300
    вопроса не было - был набор неоформленных сентенций ;)
    не относящийся к задачам мне понятным
    хэши Dim l List As ...
    у полей есть имена, а номер ниочём не говорит...
     
  12. Yakov

    Yakov Гость

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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Это хэш-функция, по-идее. А lmike упоминал хэш-таблицу (по-англ либо hash table, либо hash map ) :)
     
  14. duchan

    duchan Well-Known Member

    Регистрация:
    20 сен 2006
    Сообщения:
    106
    Симпатии:
    3
    далее обработка
    (примерно так)
    Код (Text):
        For i=0 To 4
    if isArray(TL(i)) then
    for j=0 to Ubound(TL(i))
    print TL(i)(j)
    end for
    end if
    Next
     
  15. Darker

    Darker Гость

    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
     
  16. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Если нет угрозы превышения лимита в 32К, можно использовать и такое:
    TL = ["1162:1168:1172" : "1262:138:12:1211:14" : "" : "22:777" : "2212:774:714"]
    Получать значения так:
    Код (LotusScript):
    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
     
Загрузка...

Поделиться этой страницей