枚举数组和集合

序数类型作为数组下标

定长数组 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:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注