Поиск в массиве

Тема в разделе "Lotus - Программирование", создана пользователем LIGHT, 14 дек 2007.

  1. LIGHT

    LIGHT Гость

    Есть 2 поля (многозначных) такой зависимости:

    "Иванов"
    "Петров"
    "Сидоров"

    "2"
    "5"
    "6"

    Задача

    Найти все документы Петрова и узнать значение в примере 5

    Как я вижу, нужно перебирать документы, дальше ебаунтом смотреть сколько элеменов в поле, просматривать какждый элемент, и если совпало брать элемент с таким же номером из второго поля.

    Вопрос: еслть ли др. способ поиска в массивах?
     
  2. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    <!--QuoteBegin-LIGHT+14:12:2007, 13:45 -->
    <span class="vbquote">(LIGHT @ 14:12:2007, 13:45 )</span><!--QuoteEBegin-->ебаунтом
    [snapback]89964" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    раз уж на то пошло то Убаундом ;) :D :D

    все документы для петрова можно узнать по поиску db.Search( { my_field *= "Петров" } )
    ну а дальше Ubound
     
  3. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Вместо ебаунда можно заюзать ArrayGetIndex
    Я раньше побаивался этого метода, но последние коды подверждают, что работает достаточно хорошо.
     
  4. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    и шо ? таки быстрее работает чм обычный проход по массиву?
     
  5. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    А фик знает, надо зациклить 100000 раз и проверить.
    Могу полагать, что чуток да
    Хотя хз...
     
  6. amigolinx

    amigolinx Гость

    Хех, поделюсь с сообществом... Сегодня чуть аджна-чакру не сломал из-за этого метода. Создал двумерный массив, запускаю на нем ArrayGetIndex, в ответ получаю результат с какими-то дикими смещениями. Как оказалось, на многомерных массивах ArrayGetIndex возвращает не реальный индекс элемента, а умноженный на размерность массива. Вот оно чё...
     
  7. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    я не понял задачу точно...
    но чем не устроит колекция энтрисов + навигатор?
    колекцию получаем по ключу а к навигатору приводим (ентрисы) для правильного значения по вьюшке с многозначными полями
     
  8. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Да там задача 2007 года, думаю уже неактульно

    Главная соль тут в этом:
    , Михалыч
     
  9. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    Спасибо, Капитан Очевидность.
     
  10. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ну это для тебя капитан очевидность, а lmike видимо не увидел.
    Я по капиноочевидческой привычке и разжевал.

    Если затупил, парашу паращения, настроение просто отличное, попостить охота!
     
  11. wowa

    wowa Well-Known Member

    Регистрация:
    1 фев 2007
    Сообщения:
    842
    Симпатии:
    0
    Подыму эту темку с таким вопросом:

    ArrayGetIndex - вернет первое вхождение в массив?
    т.е.

    (0) - фф
    (1) - йй
    (2) - кк
    (3) - йй

    т.е. ArrayGetIndex(array, "йй") = 1 или 3 ?
    Мне нужно последний. Если все-таки возвращает 1, то как найти последний? перебором?
     
  12. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    да, ArrayGetIndex(array, "йй") = 1, перебором, и лучше с конца :gigi:
    вроде все вопросы =)
     
  13. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    мне не понятен смысл массивов с неуникальным ключём
     
  14. wowa

    wowa Well-Known Member

    Регистрация:
    1 фев 2007
    Сообщения:
    842
    Симпатии:
    0
    Есть мульти поле History.

    (0) Действие1 # 11-11-2010
    (1) Действие2 # 12-11-2010
    (2) Действие3 # 12-11-2010
    (3) Действие2 # 13-11-2010

    Дак вот, "Действие2" может выполняться несколько раз, нужно узнать последнюю дату его выполнения
     
  15. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    записывать действия в обратном порядке
    но ваш вариант - полюбасу преобразовывать в два массива, что автоматически делает выгодным собаковождение
     
  16. nnikishi

    nnikishi Гость

    Уфф, ну и задача конечно, могу предложить слегка ракообразный способ на скрипте

    Вкратце: сначала объединяем массив в стринг, ищем справа и режем назад, считаем что получилось

    Код (Text):
    Function ArrayLastIndex (MyArray) as Long

    Dim tempstr As String
    Dim searchstr As String
    Dim newArray   

    Dim delim As String

    delim = ";" 'разделитель, можно что угодно, лишь бы оно не находилось в значении поля
    searchstr = "my name" 'что искать

    tempstr = Join(MyArray, delim) 'объединяем массив в стринг

    'проверяем а есть ли это значение вообще

    if InStr(tempstr, searchstr)>0 Then

    tempstr = Strleftback(tempstr, searchstr)
    if tempstr="" Then 'если то что мы ищем является первым значением
    ArrayLastIndex = 0
    Else

    NewArray= Split(tempstr, delim)

    ArrayLastIndex = Ubound(NewArray)
    End If
    Else
    'заглушка если этого значения нету вообще
    ArrayLastIndex =-1
    End If

    End Function
    Что то аналогичное можно родить и на собаках, думаю даже проще будет
     
  17. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    эссесвено
    Код (Text):
    v:="Действие1 # 11-11-2010":
    "Действие2 # 12-11-2010":
    "Действие3 # 12-11-2010":
    "Действие2 # 13-11-2010";
    filtered:=@Trim(@Unique(@Right(@ReplaceSubstring(v;"Действие2 #";{$$});{$$})));
    @Subset(filtered;-1);
     
  18. nnikishi

    nnikishi Гость

    ну раз пошла такая малина, то такой вариант:
    v:="Действие1 # 11-11-2010":"Действие2 # 12-11-2010":"Действие3 # 12-11-2010":"Действие2 # 13-11-2010";
    searchstr:="Действие2 # 13-11-2010";
    @If(@Contains(v; searchstr); @Elements(@Explode(@leftback(@Implode(v; ";"); searchstr); ";")); @Return(""))
     
  19. wowa

    wowa Well-Known Member

    Регистрация:
    1 фев 2007
    Сообщения:
    842
    Симпатии:
    0
    подождите, а чем плох допустим мой варант:

    Код (Text):
    i = 0
    Forall n In History
    If Not ( Instr(n, "Действие2") = 0 ) Then
    iIndex = i
    End If
    i = i + 1
    End Forall
    в конце кода узнаем индекс... Пока не тестировал, но идея такова.... То что в хистори будет "Действие2" - 100%
     
  20. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Проверяется массив сначала, если надо узнать последнее значение...
    Код (LotusScript):
    iIndex = -1
    For i=Ubound(History) to Lbound(History) Step -1
    If Instr(History(i), "Действие2") > 0 Then
    iIndex = i
    Exit For
    End If
    End For
     
Загрузка...

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