ОБСУЖДЕНИЕ

про массив

9 ответов 6 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Добрый!
есть ли функция, которая определит сколько раз определенное значение встречается в массиве
(или только обычный перебор пожет это выяснить)?
 
можно зделать так
например
Код:
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 )

могут быть ошибки, писал прям тут
 
спасибо! указанный пример работает:)
у меня result = UBound( v )
 
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 повторения
 
v = Split( v, s & "2" & s ) если с моими значениями, то так v = Split( v, s & list1(i) & s ) и тут ошибка "String is too large"
 
Имхо, проще перебрать в цикле. Универсально(работает не только для строк) и просто.

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

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

Тут проверил.
Код вида:
Код:
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:
 
Статус
Закрыто для дальнейших ответов.

Статистика тем

Создано
oxystile,
Последний ответ от
morpheus,
Ответы
9
Просмотры
5 995