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

  • Автор темы LIGHT
  • Дата начала
L

LIGHT

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

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

"2"
"5"
"6"

Задача

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

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

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

morpheus

скриптописец
07.08.2006
3 915
1
34
Украина, Киев
#2
<!--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
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
37
Латвиджа, Рига
#3
Вместо ебаунда можно заюзать ArrayGetIndex
Я раньше побаивался этого метода, но последние коды подверждают, что работает достаточно хорошо.
 
A

amigolinx

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 435
351
homepage.mac.com
#7
я не понял задачу точно...
но чем не устроит колекция энтрисов + навигатор?
колекцию получаем по ключу а к навигатору приводим (ентрисы) для правильного значения по вьюшке с многозначными полями
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
37
Латвиджа, Рига
#8
я не понял задачу точно...
Да там задача 2007 года, думаю уже неактульно

Главная соль тут в этом:
Как оказалось, на многомерных массивах ArrayGetIndex возвращает не реальный индекс элемента, а умноженный на размерность массива. Вот оно чё...
, Михалыч
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
37
Латвиджа, Рига
#10
Ну это для тебя капитан очевидность, а lmike видимо не увидел.
Я по капиноочевидческой привычке и разжевал.

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

wowa

Well-Known Member
01.02.2007
845
0
#11
Подыму эту темку с таким вопросом:

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

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

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

wowa

Well-Known Member
01.02.2007
845
0
#14
мне не понятен смысл массивов с неуникальным ключём
Есть мульти поле History.

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

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 435
351
homepage.mac.com
#15
записывать действия в обратном порядке
но ваш вариант - полюбасу преобразовывать в два массива, что автоматически делает выгодным собаковождение
 
N

nnikishi

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

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

Код:
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
Что то аналогичное можно родить и на собаках, думаю даже проще будет
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 435
351
homepage.mac.com
#17
Что то аналогичное можно родить и на собаках, думаю даже проще будет
эссесвено
Код:
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);
 
N

nnikishi

Гость
#18
ну раз пошла такая малина, то такой вариант:
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(""))
 

wowa

Well-Known Member
01.02.2007
845
0
#19
подождите, а чем плох допустим мой варант:

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

hosm

* so what *
18.05.2009
2 442
9
42
Kiev, Ukraine
#20
Проверяется массив сначала, если надо узнать последнее значение...
Код:
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