列挙配列と集合の比較

順序数型を配列添字として使用

固定長配列 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)

コンパイル時に2つの警告が出力されます

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. +:和集合、2グループの要素を統合
  3. *:積集合、両方に共通する要素を抽出
  4. Include(集合, 要素):安全に要素を追加
  5. Exclude(集合, 要素):安全に要素を削除

Previous:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です