集合(Sets)

集合是Pascal特有的一种数据类型。集合用一种有效的手段来表示一组有序数、字符和枚举值,它们包含的值没有内在的顺序,且一个值在集合中包含两次并没有实际意义。
一个集合类型的取值范围,是构成它的有序类型(称为基础类型)的幂,也就是说,集合可能的值是基础类型的所有子集,也包含空集。基础类型可能的值不要超过256 个,并且它们的序数必须在 0 到255之间。任何像下面的形式: 
set of baseType
声明一个集合类型,这里,baseType 是一个合适的有序类型。
因为基础类型的值是有限的,因此,集合类型通常使用子界类型来定义。

在Object Inspector中,Form窗体的Font属性中的Style样式就属于集合类型,包括了fsBold,fsItalic,fsUnderline和fsStrikeOut四个样式类型,如下图:

0046

下面我们来写一个完整的例子,来说明如何声明集合类型,定义集合变量及如何操作它们:

1、新建一个Console Application

2、详细代码如下,请仔细阅读注释。

program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils, Graphics;  { Graphics单元包含了TFontStyles集合}
type
  TIntSet = set of 1..250;
//等同于下面的语句
//TSomeInts = 1..250; { 子界类型}
//TIntSet = set   of TSomeInts;  { 以子界类型为基类的集合}
  TCharSet = set of Char;   { 可能的值#0~#255}
  TByteSet = set of Byte;   { 可能的值0~255}
  TEnum = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
  TEnumSet = set of TEnum;  { 包含了TEnum值的任意组合}
var
  MySet: set of 'a'..'z';  { 也可以直接使用set of …构造直接声明变量}
  Set1, Set2: TIntSet;     { TIntSet集合的变量}
  Style: TFontStyles;
  EnumSet: TEnumSet;
begin
  MySet := ['a','b','c'];  { 利用方括号来使用集合变量并给它赋值}
  Set1 := [1, 3, 5, 7, 9];
  Set2 := [2, 4, 6, 8, 10];
  EnumSet := [];           { 空集合,无元素}
  Style := [fsBold, fsItalic];
  { 利用in运算符来判断一个给定元素是否在一个集合中}
  if 'a' in MySet then
    Writeln('''a'' 元素在MySet集合中')   { 'a'在MySet中,此句得到执行}
  else
    Writeln('''a'' 元素不在MySet集合中');
  { 用+、-运算符或者Include()、Exclude()过程,能对一个集合变量增删元素}
  Include(MySet, 'd');  { MySet中增加一个'd'}
  if 'd' in MySet then Writeln('''d'' 已经增加到MySet集合, Include()');
  Exclude(MySet, 'd');
  if not ('d' in MySet) then Writeln('''d'' 已经从MySet集合中删除, Exclude()');
  MySet := MySet + ['e'];
  if 'e' in MySet then Writeln('''e'' 已经增加到MySet集合, +');
  MySet := MySet - ['e'];
  if not ('e' in MySet) then Writeln('''e'' 已经从MySet集合中删除, -');
  { 交集 Set1*Set2,可以判断在一个给定的集合中是否有某几个元素}
  if [1, 3, 5] * Set1 = [1, 3, 5] then
    Writeln('Set1集合中包含了[1, 3, 5]这三个元素')
  else
    Writeln('Set1集合中不包含[1, 3, 5]这三个元素');
  Readln;
end.

3、F9运行,查看结果以验证我们上面的代码,结果如下:

0050

4、结果和我们在代码中的逻辑完全符合。

Tip

尽可能使用Include()和Exclude()来增删元素,尽可能少使用+、-运算符。因为Include()和Exclude()仅仅需要一条机器指令,而+、-则需要13+6n(n是集合的按位的长度)条机器指令。

以上代码均在Delphi7中测试通过,示例代码下载:20111227集合(Sets).rar

posted on 2011-12-27 10:45  pchmonster  阅读(1313)  评论(0编辑  收藏  举报

导航