集合(Sets)
集合是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
posted on 2011-12-27 10:45 pchmonster 阅读(1313) 评论(0) 编辑 收藏 举报