На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Удалить дубликаты пробелов из строки
    Вопрос прост и злободневен: какой код сделает это максимально быстро? Средняя длина строки 1000 символов, количество пробелов случайно. Например, у нас есть строка "a___b__c", на выходе нужна "a_b_c" - пробел заменён подчёркиванием, т.к. тут тоже режет )
    Сообщение отредактировано: BlackSun -
      А что, ничего не придумалось?
        Да вариантов-то... Replace в цикле да RegExp...
          Вариантов много, нужен лучший.
            Цитата Akina @
            Да вариантов-то... Replace в цикле да RegExp...

            Насчёт RegExp не скажу ничего, т.к. не в курсе, а Replace в каждой итерации будет копировать всю строку.
            Может сделать Arr = Split(SrcString, "__"), а потом DstString = Join(Arr, "_")?
              Цитата BlackSun @
              Вариантов много, нужен лучший.

              отбенчмаркай каждый на реальных данных да выбери...

              Цитата Олег М @
              Replace в каждой итерации будет копировать всю строку

              тут проблемность зависит исключительно от наличия или отсутствия гарантированного потолка количества последовательных пробелов.
                Самый быстрый - простой конечный автомат, состояние которого - количество пробелов подряд. Псевдокод inplace варианта

                ExpandedWrap disabled
                   shift = 0
                    for каждого символа:
                   
                        if s[i]=пробел
                           state++
                        else
                           state = 0
                   
                        if state > 1
                           shift++
                        else
                           s[i-shift] = s[i]
                Сообщение отредактировано: MBo -
                  Цитата Akina @
                  Replace в каждой итерации будет копировать всю строку

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

                  Да, что-то я прогнал. Можно делать Replace, пока тот не вернёт такую же строку.
                      нада в цикле выполнять replace двух пробелов на один до тех пор, пока не получим результат replace той же длины, что аргумент.

                      типа так:
                      a="обрабатываемая строка"
                      do
                      b=replace a,"__","_"
                      if len(a)=len(b) then exit do
                      a=b
                      loop
                      'b содержит строку без лишних пробелов.

                      сравнивать именно длину строк вместо сравнения самих строк -- на сколько-то процентов быстрее, поэтому так.
                        Цитата DarknessPaladin @
                        на сколько-то процентов быстрее, поэтому так.

                        Если начать бороться за проценты - фтопку a=b!
                          Так побыстрее будет:
                          ExpandedWrap disabled
                            Private Sub DblSpcRemove(Src As String, Dst As String)
                              Dim L As Long, p As Long, Ar() As Integer
                              Dim i As Long, f As Boolean
                             
                              L = Len(Src)
                              ReDim Ar(L - 1)
                              CopyMemory i, ByVal VarPtr(Src), 4
                              CopyMemory Ar(0), ByVal i, L * 2
                              For i = 0 To L - 1
                                If Ar(i) = 32 Then
                                  If Not f Then
                                    f = True
                                    Ar(p) = 32
                                    p = p + 1
                                  End If
                                Else
                                  f = False
                                  Ar(p) = Ar(i)
                                  p = p + 1
                                End If
                              Next i
                              Dst = Space(p)
                              CopyMemory i, ByVal VarPtr(Dst), 4
                              CopyMemory ByVal i, Ar(0), p * 2
                            End Sub

                          Но можно ещё немного ускорить.
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0387 ]   [ 17 queries used ]   [ Generated: 19.04.24, 11:18 GMT ]