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

Вниз

Как удалить все пробелы в строке.   Найти похожие ветки 

 
Cerberus ©   (2006-05-22 20:05) [0]

сабж


 
Vlad ©   (2006-05-22 20:13) [1]

StringReplace


 
AlexanderMS ©   (2006-05-22 20:13) [2]

var
 g : string;

.......
for n := 1 to length(s) do
if s[n] <> " " then g := g + s[n];

s := g;


s - нужная строка


 
Loginov Dmitry ©   (2006-05-22 20:52) [3]

AlexanderMS ©   (22.05.06 20:13) [2]

Не самый быстрый способ...


 
Loginov Dmitry ©   (2006-05-22 21:00) [4]

... как и StringReplace :)


 
jb   (2006-05-22 21:06) [5]


p:=Pos(" ",s);
while p>0 do
begin
 Delete(s,p,1);
 p:=Pos(" ",s);
end;


 
Virgo_Style ©   (2006-05-22 21:29) [6]

мои 5 копеек - это аналог [2], только память выделить сразу же SetLength, а потом им же обрезать до нужной длины.


 
Gydvin ©   (2006-05-22 21:33) [7]


> Loginov Dmitry ©   (22.05.06 20:52) [3]
>
> AlexanderMS ©   (22.05.06 20:13) [2]
>
> Не самый быстрый способ...


А какой быстрее, поделитесь пожалуста


 
TUser ©   (2006-05-22 21:36) [8]

j := 0;
for i := 1 to length (S) do
 if S[i] = " " then
   inc (j);
SetLength (NewS, length(S) - j);
j := 1;
for i := 1 to length (S) do
 if S[i] <> " " then begin
   NewS[j] := S[i];
   inc (j);
   end;

Имхо, трудно придумать что-то быстрее.


 
Loginov Dmitry ©   (2006-05-22 21:49) [9]

Счас придумаю...

function DeleteSpaces(S: String): String;
var
 I, Counter: Integer;
begin
 SetLength(Result, Length(S));
 Counter := 0;
 for I := 1 to Length(S) do
   if S[I] <> " " then
   begin
     Inc(Counter);
     Result[Counter] := S[I];
   end;
 SetLength(Result, Counter);
end;


Имхо, это побыстрее будет.


 
Loginov Dmitry ©   (2006-05-22 22:56) [10]

А теперь, все ответившие, посмотрите хит-парад результатов...

function AlexMSDeleteSpaces(S: String): String;
var
 n: integer;
begin
 Result := "";
 for n := 1 to length(s) do
 if s[n] <> " " then Result := Result + s[n];
end;

function JBDeleteSpaces(S: String): String;
var
 p: Integer;
begin
 result := S; // сорри :)

 p:=Pos(" ",result);
 while p>0 do
 begin
   Delete(result,p,1);
   p:=Pos(" ",result);
 end;
end;

function TUserDelSpaces(S: String): String;
var
 i, j: Integer;
begin
 j := 0;
 for i := 1 to length (S) do
   if S[i] = " " then
     inc (j);
 SetLength (Result, length(S) - j);
 j := 1;
 for i := 1 to length (S) do
   if S[i] <> " " then begin
     Result[j] := S[i];
     inc (j);
   end;
end;

function DeleteSpaces(S: String): String;
var
 I, Counter: Integer;
begin
 SetLength(Result, Length(S));
 Counter := 0;
 for I := 1 to Length(S) do
   if S[I] <> " " then
   begin
     Inc(Counter);
     Result[Counter] := S[I];
   end;
 SetLength(Result, Counter);
end;

function GenerateLongString(Size: Integer): String;
var
 I: Integer;
begin
 SetLength(Result, Size);
 for I := 1 to Size do
   if Odd(I) then Result[I] := "a" else Result[I] := " ";
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 S, S1: String;
 Tc: Cardinal;
begin
 S := GenerateLongString(50000000); // Маленькая строка, всего-то 50 метров :)
 Tc := GetTickCount;
 // S1 := StringReplace(S, " ", "", [rfReplaceAll]); // более 2х минут (терпения не хватило :)
 // S1 := AlexMSDeleteSpaces(S);  // 14800 мс
 // S1 := JBDeleteSpaces(S);  // более 2х минут (терпения не хватило :)
 // S1 := TUserDelSpaces(S); // 891 мс
 S1 := DeleteSpaces(S);  // 563 мс (выишгыш в 1.58 раз :)
 ShowMessage(IntToStr(GetTickCount - Tc));
end;


Не сомневаюсь, что можно сделать еще быстрее :)


 
Gydvin ©   (2006-05-22 23:10) [11]


> Не сомневаюсь, что можно сделать еще быстрее :)

аха на ASMe   )))


 
Amoeba ©   (2006-05-23 10:53) [12]

функция Q_DelChar из библиотеки QStrings, она на asm"е.


 
Amoeba ©   (2006-05-23 10:55) [13]

function Q_DelChar(const S: string; Ch: Char): string;
asm
       PUSH    ESI
       PUSH    EBX
       PUSH    EDI
       MOV     ESI,ECX
       TEST    EAX,EAX
       JE      @@qt
       MOV     ECX,[EAX-4]
       TEST    ECX,ECX
       JE      @@qt
       MOV     EBX,EAX
       MOV     EDI,EDX
       XOR     EDX,EDX
       MOV     EAX,ESI
       CALL    System.@LStrFromPCharLen
       MOV     EDX,EDI
       MOV     ECX,[EBX-4]
       MOV     EDI,[ESI]
@@lp:   MOV     AL,BYTE PTR [EBX]
       CMP     DL,AL
       JE      @@nx
       MOV     BYTE PTR [EDI],AL
       INC     EDI
@@nx:   INC     EBX
       DEC     ECX
       JNE     @@lp
       MOV     EAX,[ESI]
       MOV     BYTE PTR [EDI],0
       SUB     EDI,EAX
       JE      @@qt
       MOV     [EAX-4],EDI
       POP     EDI
       POP     EBX
       POP     ESI
       RET
@@qt:   MOV     EAX,ESI
       CALL    System.@LStrClr
       POP     EDI
       POP     EBX
       POP     ESI
end;


 
Gydvin ©   (2006-05-23 12:46) [14]


> функция Q_DelChar из библиотеки QStrings, она на asm"е.

Интересная юнита, респект ))


 
Loginov Dmitry ©   (2006-05-23 19:54) [15]

Amoeba ©   (23.05.06 10:55) [13]

Не впечатлило :) Дельфи все-равно быстрее:

function FastDeleteSpaces(S: String): String;
var
 I, Counter: Integer;
 C, C1: PChar;
begin
 SetLength(Result, Length(S));
 Counter := 0;
 C := PChar(S);
 C1 := PChar(Result);
 for I := 1 to Length(S) do
 begin
   if C^ <> " " then
   begin
     C1^ := C^;
     Inc(C1);
     Inc(Counter);
   end;
   Inc(C);
 end;
 SetLength(Result, Counter);
end;



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

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

Наверх




Память: 0.51 MB
Время: 0.039 c
15-1147762283
Шутник
2006-05-16 10:51
2006.06.11
Обоснование выбора: СУБД vs файлы


4-1142617056
KALqYAN
2006-03-17 20:37
2006.06.11
Open -> My Computer, My Documents, Control Panel...


15-1147720258
Nous Mellon_
2006-05-15 23:10
2006.06.11
Настройка монитора


3-1145259950
eclipse
2006-04-17 11:45
2006.06.11
Базы данных... формат $ (money)


2-1148497893
S@shka
2006-05-24 23:11
2006.06.11
Ошика программы при старте под XP