Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.02;
Скачать: CL | DM;

Вниз

string routine   Найти похожие ветки 

 
Arty   (2004-12-16 11:24) [0]

Нужно сделать функцию которою удалит все дополнительные пробелы между словами в предложение.
сделал 3 варианта:

function OneSpace1(AStr: string): string;
var
 I: Integer;
begin
 Result := "";
 I := 1;
 while I <= Length(AStr) do
 begin
   if AStr[I] = " " then
   begin
     if AStr[I + 1] = " " then
       Delete(AStr, I, 1)
     else
       Inc(I);
     Continue;
   end;
   Inc(I);
 end;
 Result := AStr;
end;

function OneSpace2(AStr: string): string;
begin
 while Pos("  ", AStr) > 0 do
   AStr := StringReplace(AStr, "  ", " ", [rfReplaceAll]);
 Result := AStr;
end;

function OneSpace3(AStr: string): string;
var
 I: Integer;
 FirstOccurence: Boolean;
begin
 Result := "";
 FirstOccurence := False;
 for I := 1 to Length(AStr) do
 begin
   if AStr[I] = " " then
   begin
     if not FirstOccurence then
     begin
       FirstOccurence := True;
       Result := Result + AStr[I];
     end;
   end
   else
   begin
     FirstOccurence := False;
     Result := Result + AStr[I];
   end;
 end;
end;


но есть сомнения в их поизводительности.

может ктото знает алгоритм который будет работать быстрее ?


 
Arty   (2004-12-16 11:25) [1]

извиняюсь за граматические ошибки ;)


 
Reindeer Moss Eater ©   (2004-12-16 11:28) [2]

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


 
Суслик ©   (2004-12-16 11:28) [3]


> может ктото знает алгоритм который будет работать быстрее
> ?

имхо все зависит от задачи.
Тебе скорость то нужна?
Или это просто, для коллекции оптимальных алгоритмов?

я бы оставил третий, только поменял бы

в начала
  result := astr

в середине
  result[j] := astr[i];
  inc[j]

в конце
  setlength(result, j)

над деталями сам подумай. Так будет точно быстрее, чем строки складывать.


 
Думкин ©   (2004-12-16 11:29) [4]

в первом варианте:
что будет если строка заканчивается пробелом?


 
Александр Иванов ©   (2004-12-16 11:30) [5]

while pos("  ",Str)>0 do {Ищем два пробела}
 Delete(Str,pos("  ",Str),1);{Удаляем один}


 
Суслик ©   (2004-12-16 11:36) [6]


> [3] Суслик ©   (16.12.04 11:28)

вернее в начале  

setlength(result, length(astr))


 
Arty   (2004-12-16 11:43) [7]

Reindeer Moss Eater ©   (16.12.04 11:28) [2]

еще раз извиняюсь, не написал что задачей является обработка больших текстов поэтому и волнуюсь насчет производительность.

Суслик ©   (16.12.04 11:28) [3]
спасибо

Думкин ©   (16.12.04 11:29) [4]
в конце пробел останется но это не важно, важно между словами.
можно просто в коце добавить Result := Trim(Result);


 
Reindeer Moss Eater ©   (2004-12-16 11:44) [8]

Волноваться не надо.
Надо тестировать и замерять.


 
Суслик ©   (2004-12-16 11:46) [9]


>  [7] Arty   (16.12.04 11:43)

Если тебе действительно важна производительность, то лучше не в строке это вообще делать:
1. Выделяешь буфер, длана = длине astr
2. в нем собираешь новую строку
3. в конце ее копируешь в result (setstring используй)

Так будет еще быстрее.
Есть еще асм, но это для знающих.


 
Reindeer Moss Eater ©   (2004-12-16 11:47) [10]

Алгоритм описанный мной разумеется можно оптимизировать.
Например если строка очень длинная, то после очередного найденного двойного пробела можно искать следущее вхождение не с начала строки, а с последнего вхождения.
Используя, например, PChar и функции работы с нултерминатед стринг.


 
Arty   (2004-12-16 11:59) [11]

Reindeer Moss Eater ©   (16.12.04 11:44) [8]
я конечно это знаю. но как всегда время очень критично поэтому и попросил вас поделится опытом.

Суслик ©   (16.12.04 11:46) [9]
ясно, спасибо.


 
Sha ©   (2004-12-16 12:07) [12]

http://delphibase.endimus.ru/?action=viewfunc&topic=strchange&id=10395


 
Думкин ©   (2004-12-16 12:11) [13]

>  [7] Arty   (16.12.04 11:43)
> Думкин ©   (16.12.04 11:29) [4]
> в конце пробел останется но это не важно, важно между словами.
> можно просто в коце добавить Result := Trim(Result);

Меня это смущает:

if AStr[I + 1] = " " then

А если I = length(AStr) ?


 
Amoeba ©   (2004-12-16 12:30) [14]

Готовые быстро работающие ф-ии есть в библиотеке QStrings
http://www.torry.net/vcl/vcltools/text/adqstrings.zip
Велосипед изобретать необязательно.


 
Arty   (2004-12-16 12:35) [15]

Думкин ©   (16.12.04 12:11) [13]
действительно это так :) но AStr[I + 1]  в этом случае возвращяет #0 поэтому не заметил ошибку.


 
Sha ©   (2004-12-16 12:35) [16]

> Amoeba ©   (16.12.04 12:30) [14]

Почему необязательно? Мои чуть быстрее :)


 
Arty   (2004-12-16 12:48) [17]

Sha ©   (16.12.04 12:35) [16]
Amoeba ©   (16.12.04 12:30) [14]
thanks!



Страницы: 1 вся ветка

Текущий архив: 2005.01.02;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.054 c
3-1101982342
msguns
2004-12-02 13:12
2005.01.02
ADO+MSAccess. Длинный запрос


14-1102710383
Кудесник
2004-12-10 23:26
2005.01.02
Трансформация зрения...


14-1102958564
Чеширский_Кот
2004-12-13 20:22
2005.01.02
Шевченко получит "Золотой мяч"


4-1100768057
tradakad
2004-11-18 11:54
2005.01.02
получение активной директории приложения в Windows


1-1103286366
Cosinus
2004-12-17 15:26
2005.01.02
Хм... Никак не разберусь с TreeView