Zamiana wielu pętli w jedną

0

Witam serdecznie po długim czasie. Mam do Was pytanie jak zamienić dużą ilość pętli for w jedną. Chodzi mi o to żeby uprościć i przyspieszyć kod. Mam takie coś. Wycinam ze stringa PodzielNaCzesci wartości a następnie za pomocą pętli sprawdzam czy istnieje i dodaje. wartość kopiowana jest stała i wynosi 4.

 for i := 0 to sl.count -1 do
       if Pos(copy(PodzielNaCzesci,0,2), sl[i]) > 0 then
       sl[i] := sl[i]+' '+copy(PodzielNaCzesci,0,2);

       for i := 0 to sl.count -1 do
       if Pos(copy(PodzielNaCzesci,4,2), sl[i]) > 0 then
       sl[i] := sl[i]+' '+copy(PodzielNaCzesci,4,2);

       for i := 0 to sl.count -1 do
       if Pos(copy(PodzielNaCzesci,7,2), sl[i]) > 0 then
       sl[i] := sl[i]+' '+copy(PodzielNaCzesci,7,2);

       for i := 0 to sl.count -1 do
       if Pos(copy(PodzielNaCzesci,10,2), sl[i]) > 0 then
       sl[i] := sl[i]+' '+copy(PodzielNaCzesci,10,2);

       for i := 0 to sl.count -1 do
       if Pos(copy(PodzielNaCzesci,13,2), sl[i]) > 0 then
       sl[i] := sl[i]+' '+copy(PodzielNaCzesci,13,2);
  (...)

itd. pętli jest około 40. Pozdrawiam

1

Opisz może nieco lepiej, co ten kod robi + dodaj jakiś przykład, bo z Twojego opisu nic nie wynika.
Ale jeżeli tam naprawdę jest 40 takich pętli, to gratuluję wytrwałości.

0

aby objąć pętlą kilka instrukcji umieść je w bloku begin..end
np.

for i := 0 to sl.count -1 do
begin
       if Pos(copy(PodzielNaCzesci,13,2), sl[i]) > 0 then
       sl[i] := sl[i]+' '+copy(PodzielNaCzesci,13,2);
       if Pos(copy(PodzielNaCzesci,13,2), sl[i]) > 0 then
       sl[i] := sl[i]+' '+copy(PodzielNaCzesci,13,2);
       if Pos(copy(PodzielNaCzesci,13,2), sl[i]) > 0 then
       sl[i] := sl[i]+' '+copy(PodzielNaCzesci,13,2);
       if Pos(copy(PodzielNaCzesci,13,2), sl[i]) > 0 then
       sl[i] := sl[i]+' '+copy(PodzielNaCzesci,13,2);
end;

To co jest pomiędzy blokiem begin i end wykona się sl.count razy (kod jest tylko przykładowy)

0

Nie wiem czy dobrze interptetuje kod, ale ja bym zrobił tablicę stałych (o wielkości 40 elementów, bo tyle masz mięc pętli) z typem rekordowym, z dwoma polami typu integer i ustawił te wartości na 0 i 2, na 4 i 2, na 7 i 2, no i tak dalej. Później zrobił na początku pętlę na przykład przy zmiennej o nazwie J typu integer i przeiterował całą tę tablicę od Low do High. A jako parametry dla funkcji PodzielNaCzesci podał wartości z tej tablicy stałych, czyli pierwszego i drugiego pola rekordu. Ale może ktoś jeszcze doradzi coś lepszego, o ile się tutaj da coś lepszego wykombinować.

EDIT: zostałem "ubiegnęty" w czasie pisania tej odpowiedzi :)

1

Biorąc jedynie pod uwagę ten kod powyżej można by napisać coś takiego:

 For I := 0 To sl.Count-1 Do
  if (Pos(Copy(PodzielNaCzesci, 0, 2), sl[I]) > 0) Then
   sl[I] := sl[I]+' '+Copy(PodzielNaCzesci, 0, 2);
 
 J := 1;
 Repeat
  For I := 0 To sl.Count-1 Do
    if (Pos(Copy(PodzielNaCzesci, J, 2), sl[I]) > 0) Then
     sl[I] := sl[I]+' '+Copy(PodzielNaCzesci, J, 2);

  Inc(J, 3);
 Until (J > 3*40);

Natomiast operacje na TStringList są tak powolne, że prawdopodobnie cokolwiek starasz się napisać, istnieje milion lepszych i łatwiejszych sposobów.

0

Panowie dzięki !!! Patryk27 kod super jednak pierwszą wartość PodzielNaCzesci, 0, 2 dubluje i kopiuje x2. Jak to poprawić ?

1
J := 1;

na

J := 4;

Powinno zadziałać ;)

0

Tak zadziałało :) Wielkie dzięki :)

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