Zbiory

Ludomir

Set - zbiór. Zbiory (sets) są unikatowym, bardzo efektywnym mechanizmem właściwym językowi Pascal. Zbiory wykorzystuje się do przechowywania kolekcji elementów porządkowych. Zbiory deklaruje się za pomocą dyrektywy: set of, np:

type
  TChars = set of Char;
  TByteSet = set of Byte;

Jak wcześniej wspomniałem, zbiory służą do deklarowania prostych typów porządkowych, toteż takie deklaracje są niewłaściwe:

type
  TStrSet = set of String;
  TLongNo = set of Word;
  TSignedNo = set of Integer;

string nie jest typem wyliczeniowym, natomiast dwie następne deklaracje są niepoprawne ponieważ zbiory mogą maksymalnie zawierać 256 elementów, a numery porządkowe elementów muszą zawierać się w zakresie od 0 do 255 - Word i Integer dają nam dużo więcej elementów, ponadto Integer dałby nam elementy o numerach porządkowych ujemnych (Ord(Low(Integer)) < 0).

Zbiory mogą maksymalnie zawierać 256 elementów, a numery porządkowe elementów nie mogą przekraczać zakresu 0..255.

Inne sposoby deklaracji zbiorów:

type
  TWeekDays =  (Ni, Pn, Wt, Sr, Cz, Pt, So);
  TWeekDaysSet = set of TWeekDays ; // zbiór oparty na typie wyliczeniowym

  TDigits = set of 0 .. 9
  TLetters = set of 'A' .. 'Z';

Działania na zbiorach

Aby przypisać do zbioru jakieś elementy należy użyć konstrukcji: ```delphi var Samogloski, Spolgloski, Krzaczki: set of Char; // ... begin Samogloski := ['a', 'e', 'i', 'u', 'o', 'y']; Spolgloski := ['b' .. 'h', 'j' .. 't' {itd}]; Krzaczki := []; ``` Wyrażenie `[]` oznacza zbiór pusty. Aby dodać lub odjąć elementy zbiorów postępujemy tak jak w matematyce: ```delphi var A, B, C: set of Byte; // ... begin // ... A := B + C - [9, 14 .. 13]; // ... C := A - [0]; ``` Aby dołączyć/wyłączyć jeden element do zbioru możemy posłużyć się funkcjami `Include()` i `Exclude()`: ```delphi Include(Spolgloski, 'm'); Exclude(Samogloski, 'i');

// to samo co:
// Spolgloski := Spolgloski + ['m'];
// Samogloski := Samogloski - ['i'];

Jaka jest różnica między tymi dwoma metodami? Cytując za nieistniejącą już stroną Borlanda (http://www.borland.pl/tech/optymalizacja_wydajnosci.shtml):

> Przyglądając się eksperymentom przeprowadzanym na zbiorach danych (set) można dojść do ciekawych wniosków. Otóż okazuje się że konstrukcja postaci: s := s + ['a'] jest o dwa rzędy wielkości wolniejsza od polecenia Include(s, 'a'). Rozsądnym zatem wydaje się być natychmiastowe zastąpienie wszystkich operacji dodawania pojedynczych elementów do zbioru poprzez zastosowanie polecenia include. Zresztą obserwując implementacje podstawowych modułów Delphi zobaczymy, że wszystkie operacje związane z dodawaniem lub usuwaniem elementu zbioru (np. komponentu) wykonywane są z użyciem poleceń Include i Exclude.


Iloczyny zbiorów zapisujemy:
```delphi
var
  A, B, C: set of Byte;
// ...
begin
  A := [1, 2, 3, 4];
  B := [3, 4, 5, 6];
  C := A * B; // w zbiorze znajdą się elementy: 3, 4

Aby sprawdzić, czy w zbiorze znajduje się dany element, posługujemy się operatorem in:

var
  AvailChars: set of Char;
  X: Char;
// ...
begin
// ...
  if X in AvailChars then
    DoSomething;

Do sprawdzania, czy dany zbiór zawiera się w innym zbiorze należy posłużyć się operatorem: <=:

var
  X, Y: set of Byte;
// ...
begin
  X := [17 ..  41];
  Y := [5  ..100];

  if not (X <= Y) then
    ShowError;

6 komentarzy

Zawsze sie znajdzie ktoś, kto znajdzie pojedynczy błąd i już nie wytrzyma jak nie najedzie..

świetna znajomość Delphi? [diabel]

"Współgłoski" ??? świetna znajomość Delphi nie zwalnia chyba z poprawnego używania własnego języka nie ??

przydaje się...

to trza było poprawić ;p

artykulik dobry ale link zawiera niepotrzebny ":" na koncu :)