列舉陣列與集合之比較

序數型別做為陣列索引

固定長度陣列 Constant-length arrays

列舉型別、自訂區間序數都可做為陣列索引,彈性自訂陣列的索引範圍。

以下為列舉做陣列索引範例

type
  // 1. 一般數值區間索引 0~9
  TArrayOfTenStrings = array [0..9] of string;

  // 2. 從1開始的索引範圍 1~10
  TArrayOfTenStrings1Based = array [1..10] of string;

  // 3. 自訂序數型別,做為陣列索引
  TMyNumber = 0..9;
  TAlsoArrayOfTenStrings = array [TMyNumber] of string;

  // 4. 列舉型別直接做陣列索引(最常用)
  TAnimalKind = (akDuck, akCat, akDog);
  TAnimalNames = array [TAnimalKind] of string;
var
  AnimalNameArr: TAnimalNames;
begin
  AnimalNameArr[akDuck] := '鴨子';
  AnimalNameArr[akCat] := '貓咪';
  AnimalNameArr[akDog] := '小狗';
end;
Code language: PHP (php)

IntToStr 是標準轉換函式,定義於 SysUtils 單元。用途:將整數數值轉換為字串。

完整範例程式

{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program ArrayIndexDemo;

uses
  SysUtils; // 必須引入此單元才能使用 IntToStr

type
  // 1. 一般數值區間索引 0~9
  TArrayOfTenStrings = array [0..9] of string;

  // 2. 從1開始的索引範圍 1~10
  TArrayOfTenStrings1Based = array [1..10] of string;

  // 3. 自訂序數型別,做為陣列索引
  TMyNumber = 0..9;
  TAlsoArrayOfTenStrings = array [TMyNumber] of string;

  // 4. 列舉型別直接做陣列索引(最常用)
  TAnimalKind = (akDuck, akCat, akDog);
  TAnimalNames = array [TAnimalKind] of string;

var

  // 建立索引0-9的陣列
  Arr0To9: TArrayOfTenStrings;

  // 建立索引1-10的陣列
  Arr1To10: TArrayOfTenStrings1Based;

  // 使用自訂序數做索引的陣列
  ArrCustomIdx: TAlsoArrayOfTenStrings;

  // 宣告TMyNumber型別的迴圈變數I
  I: TMyNumber;

  // 列舉索引陣列變數
  AnimalNameArr: TAnimalNames;

begin

  // 1. 0~9索引陣列操作
  Arr0To9[0] := '第0個元素'; // 指定值
  Arr0To9[5] := '中間元素';
  Writeln(Arr0To9[0]); // 讀取值

  // 2. 從1起始索引的陣列,不可使用0存取
  Arr1To10[1] := '第一項';
  Arr1To10[10] := '最後一項';
  Writeln(Arr1To10[10]);

  // 3. 以自訂序數TMyNumber做索引,迴圈走訪
  for I := Low(TMyNumber) to High(TMyNumber) do
  begin
    ArrCustomIdx[I] := '序號' + IntToStr(I);
  end;

  Writeln(ArrCustomIdx[3]);

  // 示範透過列舉值做索引,對列舉陣列賦值
  AnimalNameArr[akDuck] := '鴨子';
  AnimalNameArr[akCat] := '貓咪';
  AnimalNameArr[akDog] := '小狗';
end.Code language: PHP (php)

編譯產生兩則警告

D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
mydemo.dpr(55,35) Warning: Implicit string type conversion from "AnsiString" to "UnicodeString"
mydemo.dpr(55,33) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString"
Linking mydemo.exe
63 lines compiled, 0.2 sec, 68464 bytes code, 4276 bytes data
2 warning(s) issued

D:\fpcdemo>mydemo
第0個元素
最後一項
序號3Code language: CSS (css)

集合型別

Sets,底層實作為位元欄位 bit-fields

集合必須依據列舉或序數型別定義,可批量存放多個列舉值,支援集合運算、增刪元素。

{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program ArrayIndexDemo;

type
  TAnimalKind = (akDuck, akCat, akDog);
  // 依據列舉定義集合型別
  TAnimals = set of TAnimalKind;
var
  A: TAnimals;
begin
  A := [];                     // 空集合常值
  A := [akDuck, akCat];        // 直接指定多個元素
  A := A + [akDog];            // 集合聯集(新增元素)
  A := A * [akCat, akDog];     // 集合交集(保留兩邊共有元素)

  Include(A, akDuck);          // 內建程序:新增單一元素
  Exclude(A, akDuck);          // 內建程序:移除單一元素
end.
Code language: PHP (php)

集合常用運算子與程序說明

  1. []:空集合常值
  2. +:聯集,合併兩組元素
  3. *:交集,取兩組共有的元素
  4. Include(集合, 元素):安全新增元素
  5. Exclude(集合, 元素):安全移除元素

Previous:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *