Форум: "Основная";
Текущий архив: 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