про массив

Тема в разделе "Lotus - Программирование", создана пользователем oxystile, 18 апр 2008.

Статус темы:
Закрыта.
  1. oxystile

    oxystile Гость

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
  3. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    можно зделать так
    например
    Код (Text):
    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 )
    могут быть ошибки, писал прям тут
     
  4. oxystile

    oxystile Гость

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

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    oxystile
    подождите не внедряйте, есть маленький изьян

    Код (Text):
    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 повторения
     
  6. oxystile

    oxystile Гость

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Имхо, проще перебрать в цикле. Универсально(работает не только для строк) и просто.

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

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    правильно, тут я ошибся

    ну так может и вправду слишком длинная?
     
  9. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Если это массив строк, то можно достаточно просто получить число повторов каждого элемента.

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

    Тут проверил.
    Код вида:
    Код (Text):
    Dim l List As Long
    Dim i As Long
    For i = Lbound(arr) To Ubound(arr)
    l(arr(i)) = l(arr(i)) + 1
    Next
    В три раза быстрее этого:
    Код (Text):
    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:
     
  10. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    интересно, скорее всего из-за отсутствия в первом примере операции сравнения ( что медленно само по себе )
     
Загрузка...
Статус темы:
Закрыта.

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