Tablica z łańcuchami znaków (string)

0

Ten problem nadaję się chyba do przedszkola :-P

Chcę utworzyć tablicę ale nie wiem jak. Chcę do niej wstawić pary ciągów znaków, następnie tablicę chcę podać do funkcji która za pomocą pętli zamieni wystąpienia poszczególnych ciągów na ich nowe odpowiedniki (za pomocą StringReplace).

Czyli tablica powinna mieć następującą postać:

star tekst 1 -> nowy tekst 1
star tekst 2 -> nowy tekst 2
star tekst 3 -> nowy tekst 3
star tekst 4 -> nowy tekst 4
star tekst 5 -> nowy tekst 5

Jak zadeklarować taką tablicę? Jak przekazać do funkcji? Jak ją wypełnić/przetworzyć za pomocą pętli? [glowa]

Proszę o wyrozumiałość i nie usuwanie tematu :-)

0

Nieraz tak jest że człowiekowi najprostsze rozwiązanie nie może przyjść do głowy. Nie wiem czy Ciebie tutaj
dobrze zrozumiałem, ale jak chcesz zamieniać pary wyrazów w tablicy, to ja bym to zrobił w taki oto sposób.

type
  PairOfStrings = record
  OldText, NewText : string;
end;

function Zamieniaj(const Text: string; Tab: array of PairOfStrings): string;
var
  I : Byte;
  S : string;
begin
  Result := '';
  S := Text;
  for I := Low(Tab) to High(Tab) do
    begin
      S := StringReplace(S, Tab[I].OldText, Tab[I].NewText, [rfReplaceAll]);
    end;
  Result := S;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  I : Byte;
  Tab : array[1..5] of PairOfStrings;
begin
  for I := Low(Tab) to High(Tab) do
    begin
      Tab[I].OldText := Format('stary tekst %d', [I]);
      Tab[I].NewText := Format('nowy tekst %d', [I]);
    end;
  Memo1.Text := Zamieniaj(Memo1.Text, Tab);
end;
0

sam sie kiedys zastanawialem nad wielokrotna zamiana slow w tekscie.
jak na razie zawsze robie kazde slowo oddzielnie za pomoca StringReplace()
tak jak podal to Olesio, bo tak jest najlatwiej to napisac.

w efekcie musimy wykonac petle po calym tekscie dla kazdego zamienianego wyrazu.
ciekawi mnie czy daloby sie jakos to zoptymalizowac i robic tylko jeden przebieg przez tekst,
a kazde slowo porownywac z lista slow do zamiany.

moznaby np miec te slowa do zamiany jakos posortowane, sprawdzac znak po znaku itp...
umozliwiloby to skrocenie czasu operacji

co o tym myslicie?

0

prawda jest taka że StringReplace jest już trochę zoptymalizowany , więc w przypadku zmiany powiedzmy jednego czy 2 wyrazów w dużym tekście będzie szybszy niż zwykła pętla po znakach. Jeśli zaś tych słów było by bardzo dużo to na pewno bardziej opłaca się napisać własny algorytm, sposobów na jego napisanie jest tyle ile programistów na świecie.

0

http://edu.i-lo.tarnow.pl/inf/alg/001_search/0042.php - strona z fajnymi algorytmami efektywnego wyszukiwania w tekście (każdy można w miarę łatwo przerobić na replace'a, a przy włożeniu pewnego wysiłku, można przerobić na sprawdzanie wielu wzorców jednocześnie).

0

To co zaproponował olesio na razie mi wystarczy. Dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1