AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

StringReplace und doppelte Zeichen

Ein Thema von Opa · begonnen am 23. Dez 2007 · letzter Beitrag vom 4. Mai 2009
Antwort Antwort
Seite 2 von 5     12 34     Letzte » 
Dax
(Gast)

n/a Beiträge
 
#11

Re: StringReplace und doppelte Zeichen

  Alt 24. Dez 2007, 00:47
Und der hier dürfte letztlich am schnellsten sein:
Delphi-Quellcode:
function ReduceMultiples(const s: string; c: char): string;
var i, pos: Integer;
begin
  SetLength(result, Length(s));
  pos := 1;
  for i := 1 to Length(s) do
  begin
    if (i = 1) or (result[pos-1] <> s[i]) then
    begin
      result[pos] := s[i];
      Inc(pos);
    end;
  end;
  SetLength(result, pos-1);
end;
  Mit Zitat antworten Zitat
Benutzerbild von Opa
Opa

Registriert seit: 12. Jun 2003
107 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: StringReplace und doppelte Zeichen

  Alt 24. Dez 2007, 02:16
S:='xxDasxxxxxLebenx ist schön';
@DAX
S:='xxDasxxxxxLebenx ist schönxx';
Caption := ReduceMultiples(S,'x');//Erg ='xxDasxxxxxLebenx ist schön' (geht nicht)
Der Name ist schön. Und schnell ist die function ggf. auch nur NICHT RICHTIG

@grenzgaenger
Caption := ReplaceDChar(S,'x'); //Erg OK, und sieht schöner aus. Bin mir nur nicht sicher ob sie schneller als meine ist
Und der Name ist auch besser.

Mfg
Wenn man nicht weiß was man sucht, findet man auch mit Google nichts.
Bevor ich hier eine Frage stelle, wurde Google vorher befragt. Hinweise dieser Art kann man sich schenken. Im übrigen muss mir niemand antworten.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#13

Re: StringReplace und doppelte Zeichen

  Alt 24. Dez 2007, 02:33
Ja, da hat sich ein Tippfehler eingeschlichen Ist korrigiert.
  Mit Zitat antworten Zitat
Benutzerbild von Opa
Opa

Registriert seit: 12. Jun 2003
107 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: StringReplace und doppelte Zeichen

  Alt 24. Dez 2007, 03:10
@ DAX
Immer noch richtig. C wird nicht genutzt. Du machst so alle doppelten Platt auch (z.B. ss)

MFG
Wenn man nicht weiß was man sucht, findet man auch mit Google nichts.
Bevor ich hier eine Frage stelle, wurde Google vorher befragt. Hinweise dieser Art kann man sich schenken. Im übrigen muss mir niemand antworten.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#15

Re: StringReplace und doppelte Zeichen

  Alt 24. Dez 2007, 03:13
Ach, mist^^ Es sei dem geneigten Leser überlassen, das noch zu ändern Auf mich wartet eine Matratze..
  Mit Zitat antworten Zitat
Benutzerbild von Opa
Opa

Registriert seit: 12. Jun 2003
107 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: StringReplace und doppelte Zeichen

  Alt 24. Dez 2007, 03:19
if (I = 1) or (Result[P-1] <> S[I]) or (Result[P-1] <>C)
So geht das ich gehe jetz auch ins Bett

MFG
PS.: Kein Ergeiz, geht doch glatt Pennen.
Wenn man nicht weiß was man sucht, findet man auch mit Google nichts.
Bevor ich hier eine Frage stelle, wurde Google vorher befragt. Hinweise dieser Art kann man sich schenken. Im übrigen muss mir niemand antworten.
  Mit Zitat antworten Zitat
Benutzerbild von Opa
Opa

Registriert seit: 12. Jun 2003
107 Beiträge
 
Delphi 7 Enterprise
 
#17

Re: StringReplace und doppelte Zeichen

  Alt 24. Dez 2007, 11:12
Opa - 00-00-00-156 - Ich x bin x der x schnellste x Hase x der der Welt
grenzgenger - 00-00-00-125 - Ich x bin x der x schnellste x Hase x der der Welt
DAX - 00-00-00-031 - Ich x bin x der x schnellste x Hase x der der Welt
----------------------------------------------------
Opa - 00-00-00-172 - Ich x bin x der x schnellste x Hase x der der Welt
grenzgenger - 00-00-00-125 - Ich x bin x der x schnellste x Hase x der der Welt
DAX - 00-00-00-016 - Ich x bin x der x schnellste x Hase x der der Welt
----------------------------------------------------
Opa - 00-00-00-172 - Ich x bin x der x schnellste x Hase x der der Welt
grenzgenger - 00-00-00-125 - Ich x bin x der x schnellste x Hase x der der Welt
DAX - 00-00-00-031 - Ich x bin x der x schnellste x Hase x der der Welt

DAX, deine ist wirklich die Schnellste, Respekt.
Meine kommt dann in die Tonne
MFG
Wenn man nicht weiß was man sucht, findet man auch mit Google nichts.
Bevor ich hier eine Frage stelle, wurde Google vorher befragt. Hinweise dieser Art kann man sich schenken. Im übrigen muss mir niemand antworten.
  Mit Zitat antworten Zitat
24. Dez 2007, 11:50
Dieses Thema wurde von "Matze" von "Tools rund um Delphi" nach "Neuen Beitrag zur Code-Library hinzufügen" verschoben.
Ich schiebe das nun hierhin. Es könnte für andere auch brauchbar sein.
Um ein Delphi-Tool geht es sowieso nicht.
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.373 Beiträge
 
Delphi 10.4 Sydney
 
#19

Re: StringReplace und doppelte Zeichen

  Alt 24. Dez 2007, 18:15
zum Original-Code:
Delphi-Quellcode:
function EntferneDoppelZeichen(Const S: String; C: Char): String;
var
  i : integer;
begin
  Result := '';
  i := Length(S);
  repeat
    if S[i] = C then
      while (i > 1) and (S[i - 1] = C) do // erst Wertebereich für i prüfen
      begin // und dann auf S zugreifen
        dec(I);
        if i < 2 then break; // i und nicht 1
      end;
    //Result := S[i] + Result;
    Insert(S, S[i], 1);
    dec(i);
  until i < 1;
end;
und hier mal was Kurzes (nicht sehr schnell, aber bestimmt schneller als'es Original, aber zumindestens ein schön kompakter Code)

schnell genug?
Delphi-Quellcode:
function EntferneDoppelZeichen(Const S: String; C: Char): String;
var
  i : integer;
begin
  Result := S;
  for i := Length(S) downto 2 do
    if (S[i] = C) and (S[i - 1] = C) then
      Delete(S, i, 1);
end;
schneller:
Delphi-Quellcode:
Function ReduceMultiples(Const S: String; C: Char): String;
  Var Pi, Po, Pe: PChar;
    Cm: Char;

  Begin
    Result := S;
    If Result = 'Then Exit;
    Pi := @Result[1];
    Pe := Pi + Length(Result);
    Inc(Pi);
    Po := Pi;
    Cm := Result[1];
    While Pi < Pe do Begin
      If (Pi^ <> Cm) or (Pi^ <> C) Then Begin
        Inc(Po);
        Cm := Pi^;
      End;
      Inc(Pi);
      Po^ := Pi^;
    End;
    SetLength(Result, Po - @Result[1] + 1);
  End;
ein bissl Langsamer, aber so ginge es och noch:
Delphi-Quellcode:
Function ReduceMultiples(Const S: String; C: Char): String;
  Var Pi, Po, Pe: PChar;

  Begin
    Result := S;
    If Result = 'Then Exit;
    Pi := @Result[1];
    Pe := Pi + Length(Result);
    Inc(Pi);
    Po := Pi;
    While Pi < Pe do Begin
      If (Pi^ <> (Po - 1)^) or (Pi^ <> C) Then Inc(Po);
      Inc(Pi);
      Po^ := Pi^;
    End;
    SetLength(Result, Po - @Result[1] + 1);
  End;
notfalls ließe sich dat Vorletzte noch leicht in ASM umwandeln.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#20

Re: StringReplace und doppelte Zeichen

  Alt 24. Dez 2007, 19:07
Hier
Delphi-Quellcode:
Function RemoveCharRepetitions(Const aText: String; aChar: Char): String;
Var
  i, j: Integer;
  c: Char;

Begin
  setLength(Result, Length(aText));
  If Length(aText)=0 Then Exit;
  j := 1;
  c := aText[1];
  Result[1] := c;
  For i := 2 To Length(aText) Do
    If aText[i] <> c Then Begin
      Inc(j);
      c := aText[i];
      Result[j] := c;
    End;
  SetLength(Result, j);
End;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 01:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf