delphi 集合的用法

时间:2023-02-07 08:21:28

http://blog.sina.com.cn/s/blog_9e2e8405010180jy.html

delphi基础补充

    1 开域语句
    在面向对象的程序代码中,嵌套对象的现象十分普遍,我们经常会去引用很深层的对象。如:
form1.canvas.font。当对一个深层对象设多个属性的时候,要写很多重复的符号,麻烦且容易出错。为此,delphi设计了开域语句。
    格式: width 对象 do ...; 一般情况下都是跟随多条语句,所有几乎总是用复合语句,即
              width 对象 do begin ... end;
    例如: with form1.canvas.font do
              begin color := clRed; size := 15; name:='宋体' end;
      2 集合的使用
      delphi中的集合是对数学中集合的概念的简单实现。要是集合中的元素必须同类型,且必须是序数类型,且集合中可能的元素个数不能大于255。
    定义: type 集合类型名 = set of 元素类型
    例如: type MySet = set of char; //注意 char 的个数本来就不超过255。
             type MyItem = (sun, moon, star); MyItem2 = 1..100;
             type MySet2 = set of MyItme; MySet3 = set of MyItem2;
    ◇我们可以测试给定的元素是否在某个集合中。 var A: MySet; 'a' in A ?
    ◇集合的常量表达法: ['a','x','c']; [1,2,4..10]; [sun, moon]
    ◇空集的表示法: []
    ◇集合间可以直接赋值。 A := []; A := [1,2,6]; A := B;
    ◇集合间可以进行标准的运算: A+B 并集; A-B 差集; A*B 交集
    我们经常使用集合来表达用户对多选控件的选择情况。因为delphi定义了标准的集合运算,就使得我们处理类似:“两个用户公共选择了哪些项?”“从选择中去掉固定的一组选则”这样问题变得十分简单容易。delphi的控件属性中,有很多的是集合类型的例子。比如
      with form1.canvas.font do style := style + [fsItalic] 就是增加了斜体特征。
 
//////////////////////另一篇文章//////////

我觉得,集合很实用,以前在程序中总要先从数据库中取出好多元素,然后逐个判断,现在知道集合这个概念,兴奋ing!哈哈啊。

集合是P a s c a l特有的数据类型,在Visual Basic、C或C + +都没有(虽然C++ Builder提供了一种模

板类称为集合,它模仿P a s c a l集合的行为)。集合用一种有效的手段来表示一组有序数、字符和枚

举值。

声明一个集合用关键字set of,并在其后跟上有序类型或一个集合可能值的有限子集。示例如下:
type
TCharSet=set of char; // 可能的值:# 0 - # 2 5 5
TEnum = ( Monday, Tuesday, Wednesday, Thursday, Friday ) ;
TEnumSet=set of TEnum; // 包含了T E n u m值的任何组合
TSubrangeSet=set of 1..10; // 可能的值:1 - 1 0
TAlphaSet=Set of 'A'..'z';      // 可能的值:' A ' - ' z '

注意,一个集合最多只能有2 5 5个元素。另外,只有有序的类型才能跟关键字 set of,因此下列的
代码是非法的:
t y p e
TIntSet=set of Integer; // 非法:太多的元素
TStrSet=set of string;    // 非法:不是有序的类型

集合在内部以位的形式存储它的元素,这使得在速度和内存利用上更有效。集合如果少于 3 2个元
素,它就存储在C P U的寄存器中,这样效率就更高了,为了用集合类型得到更高的效率。记住,集合
的基本类型的元素数目要小于3 2。
1. 使用集合
当使用集合的元素时,使用方括号。下面代码表明如何使用集合类型的变量并给它赋值。

(1)直接在所在过程中var中定义:
var
SubrangeSet:set of 1..10;(可能是1到10中任何数)
begin
SubrangeSet:=[1,2,4..6];
end;

(2)在Type中定义:
type
TCharSet=set of char;

var
CharSet:TCharSet;
begin
CharSet:=['A'..'J','a','m'];
end;

2. 集合操作符

Object Pascal提供了几个用于集合的运算符,用这些运算符可以判断集合和集合之间的关系,对
合增删元素,对集合进行求交集运算。

(1) 关系运算
用in运算符来判断一个给定的元素是否在一个集合中,下面的代码判断在前面所定义的集合
CharSet中是否有字母‘S’:
if 'S' in CharSet then
/ /继续运行
下面的代码判断在EnumSet中是否没有Monday :
if not (Monday in EnumSet) then
/ /继续运行

(2) 增删元素
用+、-运算符或Include( )和Exclude( )过程,能对一个集合变量增删元素:
Include(CharSet, 'a');/ /在集合中增加'a' ;
CharSet : = CharSet+['b'] ;/ /在集合中增加'b' ;
Exclude(CharSet, 'x');/ /在集合中删除'x' ;
CharSet:=CharSet-['y', 'z'];/ /在集合中删除'y'和'z' ;
提示 尽可能地用Include()和Exclude()来增删元素,尽可能地少用+、-运算符。因为Include()和
Exclude()仅需要一条机器指令,而+和-需要13+6n(n是集合的按位的长度)条机器指令。

(3) 交集
用*运算符来计算两个集合的交集,表达式Set1 * Set2的结果是产生的集合的元素在Set1和
Set2集合
都存在,下面的例子用来判断在一个给定的集合中是否有某几个元素:
if {'a', 'b', 'c'}*CharSet={'a', 'b', 'c'} then
/ /继续程序

////////////////////////另一篇文章//////////

unit Unit4;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,

Forms,
  Dialogs, StdCtrls;
type
  TEnum = (One, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten);
  TSetEnum = set of TEnum;
  TForm4 = class(TForm)
    GroupBox1: TGroupBox;
    Button1: TButton;
    Button2: TButton;
    GroupBox2: TGroupBox;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
  private
    SetEnum, SetEnum1, SetEnum2: TSetEnum ;
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.Button1Click(Sender: TObject);
var
  s1, s2: string;
begin
  s1 := 'aaa';
  s2 := s1;
  s2 := 'bbb';
  ShowMessage('字符串S1的值:  ' + s1 + ' ; 字符串S2的值: ' + S2);
end;
procedure TForm4.Button2Click(Sender: TObject);
var
  A1, A2: array of string;
begin
  SetLength(A1, 1);
  A1[0] := 'aaa';
  A2 := A1;
  A2[0] := 'bbb';
  ShowMessage('数组A1的值:' + A1[0]+ ' ;数组A2的值:' + A2[0]);
end;
//初始化
procedure TForm4.Button3Click(Sender: TObject);
begin
  SetEnum  :=  [one, Two];
  SetEnum1 := [Three, Nine, Ten]
end;
//集合减少
procedure TForm4.Button5Click(Sender: TObject);
begin
  SetEnum := SetEnum - [Two];
end;
//集合增加
procedure TForm4.Button6Click(Sender: TObject);
begin
  SetEnum := SetEnum + [Three];
end;
//集合减少
procedure TForm4.Button7Click(Sender: TObject);
begin
  Exclude(SetEnum, One);
end;
//集合增加
procedure TForm4.Button4Click(Sender: TObject);
begin
  Include(SetEnum, Four);
  Include(SetEnum, Ten);
end;
//执行校验
procedure TForm4.Button8Click(Sender: TObject);
begin
  if One in SetEnum then
  begin
    ShowMessage('Exclude函数执行失败');
  end
  else if Two in SetEnum then
  begin
    ShowMessage('SetEnum - [Two]执行失败');
  end
  else if not (Three in SetEnum) then
  begin
    ShowMessage('SetEnum + [Three]执行失败');
  end
  else if not (Four in SetEnum) then
  begin
    ShowMessage('Include函数执行失败');
  end
  else if not (ten in SetEnum) then
  begin
    ShowMessage('Include函数执行失败');
  end
  else
  begin
    ShowMessage('执行成功!');
  end;
end;
//取得集合的交集
procedure TForm4.Button9Click(Sender: TObject);
begin
  SetEnum2 := SetEnum1 * SetEnum;
  if Three in SetEnum2 then
  begin
    ShowMessage('交集成功执行成功');
  end;
end;
end.
———————————————————————————————————————

—————————————————————
———————————————————————————————————————

—————————————————————
object Form4: TForm4
  Left = 359
  Top = 186
  Width = 558
  Height = 418
  Caption = 'Form4'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object GroupBox1: TGroupBox
    Left = 24
    Top = 16
    Width = 209
    Height = 145
    Caption = '字符串和数组的的应用'
    TabOrder = 0
    object Button1: TButton
      Left = 24
      Top = 40
      Width = 169
      Height = 25
      Caption = '字符串的引用'
      TabOrder = 0
      OnClick = Button1Click
    end
    object Button2: TButton
      Left = 24
      Top = 88
      Width = 169
      Height = 25
      Caption = '数组的引用'
      TabOrder = 1
      OnClick = Button2Click
    end
  end
  object GroupBox2: TGroupBox
    Left = 238
    Top = 22
    Width = 307
    Height = 139
    Caption = '集合的应用'
    TabOrder = 1
    object Button3: TButton
      Left = 24
      Top = 24
      Width = 80
      Height = 25

///////////////////////另一篇文章///////////

DELPHI集合类型
点击:   发布日期:2007-8-19 9:12:00   进入论坛
    集合(Set)是由具有某些共同特征的元素构成的一个整体,这些元素必须是有序类型

,如,整型、布尔型、字符型、枚举型和子界型。
    1.集合类型的定义
    集合类型变量定义的语法格式为:
    type
    <类型标识符>=set of<基类型>
其中,基类型是指集合中的元素必须是同一有序数据类型。Pascal语言规定集合的元素个

数最多不得超过256个;因此基类型的序数值必须在O~255之间,例如:
    type
    Name=set of char;
    Boolset=set of boolean;
    Weekday=(Sun,Mon,Tue,Wed,Thu,Fri,Sat);
    Week:set of weekday;
    2.集合变量的定义    ’
    集合类型定义的语法格式为:
    (1)已定义集合类型
    var<变量名>:<集合类型标识符>;
    (2)与类型定义结合在一起  .
    var<变量名>:set of<基类型>;
    傻f如:    var si:set oi-O..25 5;
    sn:Name;
    si是整数类型的集合变量,sn是Name集合类型的变量。
    3.集合变量的赋值
    程序中可以对集合变量赋集合常量值,例如:
    si:=[1..6,9];
    sn:=  [’A’..’Z’,’a’..’z’,’O’..’9’];
    集合类型变量的取值范围为包含空集在内的集合的所有子集,但是集合中的元素不能

重复出现o
  4.集合类型的运算
  集合类型能够进行比较运算和集合运算。
  集合的比较运算有“<=”、“>=”和“in",分别表示包含于、包含和属于运算。此外

还有
“=”、“<>"表示集合相等和集合不等,例如:[1,2]<=[1..3]的结果是true;1 in

[O..6]的结果是true。
    集合运算有并(+)、交(木)、差(一)运算,它们的结果还是一个集合。例如:
    集合A:[1,2,6,7]
    集合B:[2,3,5,6,7,9]
    集合A+B:[1,2,3,5,6,7,9](由属于集合A或属于集合B的所有元素组成)
    集合A术B:[2,6,7](由属于集合A又属于集合B的所有元素组成)
    集合A-B:[1](由属于集合A而不属于集合B的所有元素组成)
      Caption = '集合初始化'
      TabOrder = 0
      OnClick = Button3Click
    end
    object Button4: TButton
      Left = 216
      Top = 68
      Width = 80
      Height = 25
      Caption = '集合增加2'
      TabOrder = 1
      OnClick = Button4Click
    end
    object Button5: TButton
      Left = 112
      Top = 28
      Width = 80
      Height = 25
      Caption = '集合减少1'
      TabOrder = 2
      OnClick = Button5Click
    end
    object Button6: TButton
      Left = 216
      Top = 28
      Width = 80
      Height = 25
      Caption = '集合增加1'
      TabOrder = 3
      OnClick = Button6Click
    end
    object Button7: TButton
      Left = 112
      Top = 68
      Width = 80
      Height = 25
      Caption = '集合减少2'
      TabOrder = 4
      OnClick = Button7Click
    end
    object Button8: TButton
      Left = 24
      Top = 72
      Width = 81
      Height = 25
      Caption = '检测集合值'
      TabOrder = 5
      OnClick = Button8Click
    end
    object Button9: TButton
      Left = 120
      Top = 104
      Width = 81
      Height = 25
      Caption = '集合的交集'
      TabOrder = 6
      OnClick = Button9Click
    end
  end
end