Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нормализовать строку


weeeeee ©   (2006-10-15 11:30:00) 

Есть необходимость привести некую строку к нормальному виду, под нормальным видом я понимаю слудующее:
"ЭЙ каКДела  вА    дм ИНи стрАЦ ии" = "эйкакделавадминистрации", -- правая часть этого выражения "нормализованная".
Сделал таким образом, но может, не рационально? Что подскажете?

MyString -- источник.
 MyString := LowerCase(MyString);
 while Pos(' ', MyString) <> 0 do
   Delete(MyString, Pos(' ', MyString), 1);
 Result := MyString;


Рамиль   (2006-10-15 15:44:00) [1]


> А, собственно, зачем в другую?

А как? Кадый раз переносить конец строки?


> А что в данном случае бует работать быстрее: StringReplace
> или DeleteSpaces?

Я не дождался конца работы StringReplace что бы сравнить:

var
 a, b: string;
 t, i: integer;
begin
 b := 'ghk bdf fr';
 setlength(a, 1000000);
 for i:= 1 to 1000000 do
   a[i] := b[random(9) + 1];
 t := GetTickCount;
 DeleteSpaces(a);
 ShowMessage(IntToStr(GetTickCount - t));
 t := GetTickCount;
 StringReplace(a, ' ', '', [rfReplaceAll]);
 ShowMessage(IntToStr(GetTickCount - t));
end;


weeeeee   (2006-10-15 15:30:00) [2]

А что в данном случае бует работать быстрее: StringReplace или DeleteSpaces?


Virgo_Style   (2006-10-15 14:44:00) [3]

Рамиль ©   (15.10.06 12:02) [1]
А само удаление, наверное, будет быстрее если копировать в другую строку


А, собственно, зачем в другую?


Loginov Dmitry   (2006-10-15 14:33:00) [4]

Result := AnsiLowerCase(StringReplace(Str, ' ', '', [rfRelpaceAll]));


Рамиль   (2006-10-15 14:20:00) [5]

типа такого

function DeleteSpaces(const Value: string): string;
var
 Counter, i: integer;
begin
 Counter := 0;
 SetLength(Result, Length(Value));
 for i := 1 to Length(Value) do
   if Value[i] <> ' ' then
   begin
      inc(Counter);
      Result[Counter] := Value[i];
   end;
 SetLength(Result, Counter);
end;


weeeeee   (2006-10-15 12:44:00) [6]

Спасибо! Но второе я что-то совесем плохо воспринял, можно кусочком кода?, если возможно.


Рамиль   (2006-10-15 12:02:00) [7]

Должно быть AnsiLowerCase

А само удаление, наверное, будет быстрее если копировать в другую строку (предварительно сделав SetLength и вызвать повторно в конце, посчитав количество перенесенных символов)


Наверх

Титульная страница Поиск, карта сайта Написать письмо