Jak usunąć dowolny element tablicy?
2008-02-23
11:49:00
11:49:00
Potrzebuję usunąć jakiś tam element tablicy, ale nie znalazłem żadnej funkcji która by to robiła.
Burak.
Cóż, nie da się ot tak usunąć dowolnego elementu tablicy ze względu na jej budowę która jest ciągła i nierozłączna. Aby usunąć element musimy więc przesunąć "o jeden w lewo" (w kierunku pierwszego elementu) wszystkie elementy stojące za elementem którego chcemy się pozbyć. Dlatego przy częstych tego typu operacjach lepiej wykorzystać listy, ponieważ na tablicach takie operacje są bardzo wolne.
Ale cóż - oto kod:
Przed globalnym słówkiem var (tym, przed sekcją implementation), musimy zadeklarować nowy typ tablicowy"
type
TTablicaInteger = array of integer;
Następnie kładziemy na formę jakiś przycisk i komponent Memo (to w celu zobrazowania poprawności działania). Klikamy dwukrotnie na przycisk i wpisujemy kod:
procedure TForm1.Button1Click(Sender: TObject);
var
tablica : TTablicaInteger;
i : integer;
begin
// Alokujemy dynamiczną tablicę na 10 elementów
SetLength(tablica, 0);
// Wypełniamy tablicę losowymi liczbami
Randomize();
for i:=Low(tablica) To High(tablica) Do
tablica[i] := Random(1000);
// Wypisujemy elementy tablicy
for i:=Low(tablica) To High(tablica) Do
Memo1.Text := Memo1.Text + IntToStr(tablica[i]) + ', ';
// Usuwamy środkowy element tablicy
UsunElementTablicy(high(tablica) div 2,tablica);
Memo1.Lines.Add('');
Memo1.Lines.Add('Po usunięciu:');
// Wypisujemy elementy tablicy
for i:=Low(tablica) To High(tablica) Do
Memo1.Text := Memo1.Text + IntToStr(tablica[i]) + ', ';
end;
Następnie dodajemy nową procedurę "UsunElementTablicy", która będzie działała nam przez referencję (aby przyspieszyć operacje).
procedure UsunElementTablicy(nr : integer; var tablica: TTablicaInteger);
var
i : integer register; // wprowadź zmienną do szybkiego rejestru procesora
begin
// Jeśli tablica jest pusta to nie rób nic
if Length(tablica)=0 Then Exit;
// Przesuwamy wszystkie elementy znajdujące się po elemencie o indeksie 'nr'
// "w lewo", (w kierunku pierwszego elementu)
for i:=nr To high(tablica)-1 Do
tablica[i] := tablica[i+1];
// Usuwamy ostatni element tablicy
SetLength(tablica,high(tablica));
end;
Mimik
Data publikacji:
12:51, 23 February 2008
12:51, 23 February 2008
Zaloguj się aby dodać post.