集合是Pascal特有的一种数据类型。集合用一种有效的手段来表示一组有序数、字符和枚举值,它们包含的值没有内在的顺序,且一个值在集合中包含两次并没有实际意义。
一个集合类型的取值范围,是构成它的有序类型(称为基础类型)的幂,也就是说,集合可能的值是基础类型的所有子集,也包含空集。基础类型可能的值不要超过256 个,并且它们的序数必须在 0 到255之间。任何像下面的形式:
set of baseType
声明一个集合类型,这里,baseType 是一个合适的有序类型。
因为基础类型的值是有限的,因此,集合类型通常使用子界类型来定义。
在Object Inspector中,Form窗体的Font属性中的Style样式就属于集合类型,包括了fsBold,fsItalic,fsUnderline和fsStrikeOut四个样式类型,如下图:
下面我们来写一个完整的例子,来说明如何声明集合类型,定义集合变量及如何操作它们:
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运行,查看结果以验证我们上面的代码,结果如下:
4、结果和我们在代码中的逻辑完全符合。
Tip
尽可能使用Include()和Exclude()来增删元素,尽可能少使用+、-运算符。因为Include()和Exclude()仅仅需要一条机器指令,而+、-则需要13+6n(n是集合的按位的长度)条机器指令。
以上代码均在Delphi7中测试通过,示例代码下载:20111227集合(Sets).rar