Tablice dynamiczne - usuwanie komórek. Pomocy

0

Cześć wszystkim!
Słuchajcie nie mogę sobie poradzić z tym problemem:
Mam tablicę dynamiczną i ustawiam wielkość (SetLength), ale później potrzebuje usunąć np. 3 indeks (całą komórkę), ale również nie chcę, aby zostało puste miejsce tylko chcę pomniejszyć tą tablicę o 1, a resztę cofnąć do pozycji usuniętego.

np. [0] = 'kom1'; [1] = 'kom2'; [2] = 'kom3'; [3] = 'kom4';
usuwam np. [1]
[0] = 'kom1'; [1] = 'kom3'; [2] = 'kom4';

0
procedure(indeks:integer);
var i:integer;
begin
  for i:=Indeks do High(T)-1 do T[i]:=T[i+1];
  SetLength(T,Length(T)-1);
end;

T - tablica
indeks - ten który chcesz usunąć

0

dzięki wielkie!

0

Robi się to przy pomocy pętli oraz metodą podmiany. Zamieniasz to co masz pod indeksem x na to co masz pod indeksem x+1 aż do końca talicy. Na koniec skracasz talicę o 1 i wszystko. Trochę kopotliwe ale nie ma innej metody

0

Jest prostszy sposób: Delete(T,Index,1);

0

Trochę kopotliwe ale nie ma innej metody

Można użyć move żeby przyśpieszyć przenoszenie tablicy i uniknąć pętli.

Jest prostszy sposób: Delete(T,Index,1);

FPC wskazuje że to tylko do stringów: http://www.freepascal.org/docs-html/rtl/system/delete.html
Więc dołączam się do pytania Patryka27 - na jakim kompilatorze to działa? Jak pokażesz taki to pogadam z developerami FPC żeby dodali.

0

Taki kod popełniony z nudów:

{$MODE DELPHI}
{$H+}

Type TIntArray = Array of Integer;

Type GArray<T> = Class
                  Type TArray = Array of T;
                  Class procedure Delete(var Arr: TArray; const Index: LongWord);
                 End;

Class procedure GArray<T>.Delete(var Arr: T; const Index: LongWord);
Var I: LongWord;
Begin
 For I := Index To High(Arr)-1 Do
  Arr[I] := Arr[I+1];
 SetLength(Arr, High(Arr));
End;

Procedure Display(A: TIntArray);
Var I: Byte;
Begin
 For I := Low(A) To High(A) Do
  Writeln('[', I, '] = ', A[I]);
 Writeln;
End;

Var A: TIntArray;
    I: Byte;
Begin
 SetLength(A, 10);
 For I := Low(A) To High(A) Do
  A[I] := I;

 Display(A);
 GArray<Integer>.Delete(A, 5);
 Display(A);

 Readln;
End.

Mamy generyczną klasę GArray która posiada metodę Delete usuwającą z tablicy dynamicznej wartość znajdującą się pod danym indeksem.
W związku z tym, iż metoda ta oznaczona jest jako class procedure, nie potrzeba konstruktora klasy, by móc ją wywołać.
Nie ma potrzeby nawet tworzenia zmiennej, bo mamy od tego konstrukcję która tworzy ją i usuwa "w locie":
GArray<podstawowy typ tablicy>.Delete(tablica, indeks); (nie działa w trybie objfpc).
Może komuś się przyda, lecz zostawiam bardziej jako ciekawostkę; testowane pod FPC 2.6.0 :P

(uwaga: klasa działa jedynie na tablicach 1D, a indeks nie może być mniejszy od zera)

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