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

Вниз

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

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

Наверх





Память: 0.49 MB
Время: 0.012 c
1-1146575623
Creative
2006-05-02 17:13
2006.06.11
многочисленные Children


15-1146018946
Не химик
2006-04-26 06:35
2006.06.11
Какое расстояние между атомами железа?


15-1147336189
Marser
2006-05-11 12:29
2006.06.11
Могли бы Вы стать гуманитарием?


8-1134483031
calmterror
2005-12-13 17:10
2006.06.11
Визуализация звука


1-1146736958
GanibalLector
2006-05-04 14:02
2006.06.11
форма в DLL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский