【Delphi 基础知识 14】set of 集合数据类型

在Delphi中,set of 是一种用来表示集合的数据类型。它允许你定义包含一组唯一元素的集合。set of 在 Delphi 中通常用于处理位集合,每个元素对应一个位。
首先看一个简单的用法:

type
  TColor = (Red, Green, Blue, Yellow, Purple, Orange);

  TColorSet = set of TColor;

//打印输出ColorSet中的情况
procedure PrintColorSet(const colorSet: TColorSet);
begin
  Writeln('Selected Colors:');
  if Red in colorSet then
    Writeln('Red is selected');
  if Green in colorSet then
    Writeln('Green is selected');
  if Blue in colorSet then
    Writeln('Blue is selected');
  if Yellow in colorSet then
    Writeln('Yellow is selected');
  if Purple in colorSet then
    Writeln('Purple is selected');
  if Orange in colorSet then
    Writeln('Orange is selected');
  Writeln;
end;

//把颜色加入到ColorSet
procedure SelectColor(var colorSet: TColorSet; color: TColor);
begin
  Include(colorSet, color);
end;

//把颜色从ColorSet删除
procedure DeselectColor(var colorSet: TColorSet; color: TColor);
begin
  Exclude(colorSet, color);
end;

begin
  // 初始化 color set
  var selectedColors: TColorSet := [];

  // 加入红、蓝 color
  SelectColor(selectedColors, Red);
  SelectColor(selectedColors, Blue);
  PrintColorSet(selectedColors);

  //删除红 color
  DeselectColor(selectedColors, Red);
  PrintColorSet(selectedColors);

  // 检查绿 color在不在其中
  if Green in selectedColors then
    Writeln('Green is selected')
  else
    Writeln('Green is not selected');

  Readln;
end.

然后再看一下最基本的使用方法:

定义集合类型

type
  TMySet = set of 1..5; // 定义一个包含整数 1 到 5 的集合类型

上述代码中,TMySet 是一个 set of 类型的集合,包含整数 1 到 5。

初始化集合

var
  mySet: TMySet;
begin
  mySet := [2, 4]; // 初始化集合,包含元素 2 和 4

集合操作

  • 并集 (Union)

    var
      setA, setB, resultSet: TMySet;
    begin
      setA := [1, 3, 5];
      setB := [2, 4, 5];
      
      resultSet := setA + setB; // 并集
    end;
    
  • 交集 (Intersection)

    var
      setA, setB, resultSet: TMySet;
    begin
      setA := [1, 3, 5];
      setB := [2, 4, 5];
      
      resultSet := setA * setB; // 交集
    end;
    
  • 差集 (Difference)

    var
      setA, setB, resultSet: TMySet;
    begin
      setA := [1, 3, 5];
      setB := [2, 4, 5];
      
      resultSet := setA - setB; // 差集
    end;
    

检查元素是否在集合中

if 3 in mySet then
  ShowMessage('3 is in the set')
else
  ShowMessage('3 is not in the set');

遍历集合

var
  element: Integer;
begin
  for element in mySet do
    ShowMessage(IntToStr(element));

这是一个简单的示例,实际上,你可以在 Delphi 中更复杂的应用场景中使用集合,例如状态管理、标志位的操作等。

在演示一个状态管理的示例:

unit StateManagementUnit;

interface

uses
  SysUtils, Classes;

type
  TState = (Idle, Working, Finished, Error);

  TStateManager = class
  private
    FCurrentState: TState;
  public
    constructor Create;
    procedure SetState(newState: TState);
    function GetState: TState;
  end;

implementation

{ TStateManager }

constructor TStateManager.Create;
begin
  FCurrentState := Idle; // 初始化状态为 Idle
end;

procedure TStateManager.SetState(newState: TState);
begin
  FCurrentState := newState;
end;

function TStateManager.GetState: TState;
begin
  Result := FCurrentState;
end;

end.

在这个示例中,TState 是一个枚举类型,表示可能的状态。TStateManager 是一个简单的状态管理类,其中包含一个私有成员 FCurrentState 用于存储当前状态。

接下来,我们可以在主程序中使用这个状态管理类:

program StateManagementExample;

{$APPTYPE CONSOLE}

uses
  SysUtils, StateManagementUnit;

var
  StateManager: TStateManager;

begin
  StateManager := TStateManager.Create;

  // 获取和输出初始状态
  Writeln('Initial State:', Ord(StateManager.GetState));

  // 设置新状态并输出
  StateManager.SetState(Working);
  Writeln('Current State:', Ord(StateManager.GetState));

  // 切换状态并输出
  StateManager.SetState(Finished);
  Writeln('Current State:', Ord(StateManager.GetState));

  // 释放资源
  StateManager.Free;

  Readln;
end.

这个示例中,我们首先创建了一个 TStateManager 实例,然后通过调用 SetState 方法来设置不同的状态,通过 GetState 方法获取当前状态,并输出在控制台上。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南通DXZ

请我喝杯咖啡吧,鼓励一下创作!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值