Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.04 c
1-1103122513
Erik1
2004-12-15 17:55
2005.01.02
Как получить свойство ReadOnly в неизвестном наследнике?


14-1102624027
iZEN
2004-12-09 23:27
2005.01.02
Обокрали, однако...


3-1102325571
ksa2002
2004-12-06 12:32
2005.01.02
Вопрос по IBDataset


1-1102684936
JohnKorsh
2004-12-10 16:22
2005.01.02
Как распечатать Help?


3-1101991675
Дмитрий_Д
2004-12-02 15:47
2005.01.02
Можно ли средствами MySQL выбрать из таблицы случайное поле?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский