про массив

  • Автор темы oxystile
  • Дата начала
Статус
Закрыто для дальнейших ответов.
O

oxystile

#1
Добрый!
есть ли функция, которая определит сколько раз определенное значение встречается в массиве
(или только обычный перебор пожет это выяснить)?
 

morpheus

скриптописец
07.08.2006
3 915
1
#3
можно зделать так
например
Код:
dim arr(5) as string
Dim v as Variant
Dim result as INteger
arr = "1":"2":"3":"2":"7"

v = implode ( arr )
v = Split( v, "2" )
result = Ubound(arr) - UBound( v )
могут быть ошибки, писал прям тут
 
O

oxystile

#4
спасибо! указанный пример работает:)
у меня result = UBound( v )
 

morpheus

скриптописец
07.08.2006
3 915
1
#5
oxystile
подождите не внедряйте, есть маленький изьян

Код:
dim arr(5) as string
Dim v as Variant
Dim result as INteger
arr = "1":"2":"3":"2":"7"
dim s as string
s = "$$#"
v = s & implode ( arr, s ) & s 
v = Split( v, s & "2" & s )
result = UBound( v )
при таком варианте не будет ошибок с массивом "1":"2":"3":"2":"72":"7" - тут результат повторений был бы 3, а на самом деле тут 2 повторения
 
O

oxystile

#6
v = Split( v, s & "2" & s ) если с моими значениями, то так v = Split( v, s & list1(i) & s ) и тут ошибка "String is too large"
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#7
Имхо, проще перебрать в цикле. Универсально(работает не только для строк) и просто.

Вот еще один способ. Вроде ничем не быстрее цикла:
(Len(Join(array)) - Len(Join(Arrayreplace(array, symbol, "")))) / Len(symbol)
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#9
Если это массив строк, то можно достаточно просто получить число повторов каждого элемента.

Хотя, можно иметь массив любого типа.

Тут проверил.
Код вида:
Код:
Dim l List As Long
Dim i As Long
For i = Lbound(arr) To Ubound(arr)
l(arr(i)) = l(arr(i)) + 1
Next
В три раза быстрее этого:
Код:
Dim i As Long
Dim c As Long
For i = Lbound(arr) To Ubound(arr)
If arr(i) = symbol Then c = c + 1
Next
Я поражен. :rolleyes:
 
Статус
Закрыто для дальнейших ответов.