Delphi集合の使い方
3988 ワード
参考:http://www.cnblogs.com/doit8791/archive/2012/08/17/2644859.html
集合はPascal特有のデータタイプで、Visual Baic、C/C++がない(C++Buiderはテンプレートクラスを提供して集合になりますが、それはPascal集合の行為を模倣しました).集合は、順序、文字、列挙値のセットを有効な手段で表す.一つのセットをキーワードでset ofとして宣言し、その後に順序付けられたタイプまたは1つのセットは、すべての限定的なサブセットに値するかもしれない.例は以下の通りです
一、集合を使う
集合の要素を使用する場合は、四角い括弧を使用します.下のコードは、集合型の変数をどのように使用し、値を与えますか?
1.直接所在過程におけるvarの定義
二、集合の値
1.セットの値を相手の括弧に入れ、各要素はカンマで区切られます.例えば、[1,2,5]と[a',e',i']は集合です.
2.集合の中には何の要素もなくてもよい.このような集合を空セットと呼ぶ.空セット
3.集合において、要素の値が連続的であれば、サブ期型の表現法で表現することができる.例えば、[1,2,3,4,5,6,10,15]を[1.5,10,15]と表現しても良い.
4.集合の値は、括弧内の要素の出現の順序とは関係ありません.例えば[1,5,8]と[1,8,5]の値は等しいです.
5.集合中の同じ要素の繰り返しは、集合の値に影響を及ぼさない.例えば[1,8,5,1,8]と[1,5,8]の値が等しい.
6.各要素は基本タイプによって許容される表現で表現されます.[1,1+1,4]、[succ(ch)]のように
三、集合の演算
集合型変数は算術演算ができません.集合は無秩序ですので、ord、pred、succなどの関数は使えません.
1.割当演算
集合変数には、値を割り当てられた語句だけが与えられます.文章を読むことによって値が割り当てられません.また、文章を書くことによって、集合変数の値が直接出力されません.例えば:
各演算は1つの演算子と2つの演算オブジェクトだけで、結果はまだセットになります.一つは算術演算との違いです.
1)併算(関係代数演算子∪)
A、Bは2つのセットであり、セットAの要素にBと重複しないすべての要素からなるセットは、セットAとBの和となる.A+Bです
[X,Y,Z]+[X]は[X,Y,Z]{2つのセットで重複しないすべての要素}です.
[1]+[4]は[1,4]である.
+、−演算子またはInclude()とExclude()のプロセスを使って、1つのセット変数を削除することができます.
2) 演算(関係代数演算子∩)
A、Bは2つの集合であり、集合Aに属し、集合Bに属する全ての要素からなる集合を集合AとBという.つまりA*Bです.
[X,Y,Z]*[X]は[X]{二つのセットの中の同じ要素}.
[X,Y,Z]*は[]です.
3)差分演算(関係代数演算子-)
A、Bは2つのセットであり、集合Aの要素から、集合Bの中のAと同じ要素からなる要素を除去し、集合AとBの差、すなわちA−Bと称する.
[X,Y,Z]-[X]は[Y,Z]{集合Aにおいて、集合Bにないすべての要素}である.
[X,Y,Z]-[X,Y,Z]
3.セットの関係演算:演算結果はブール値です.
関係演算子:
=等しい
<>等しくない
>=含む、前者は後者を含むという意味です.
<=は、前者が後者に含まれることを表す.
例えば、[a,b,c]=[b,c,a]はtrueであり、要素の個数は同じで、内容は同じであり、配列の順序にかかわらず.[a,b,c]=[a]はtrueです.[a,b]<=[a,b,c]はtrueです.
n演算:inの右側は集合で、左は集合ベースのタイプと同じ式で、ブール型です.nテストは、1つの要素がセットにあるかどうかです.集合論に当たる∈.これらはすべて2つの目演算であり、前の4つの演算子の演算対象はすべて互換性のあるセットタイプである.例えば、a in[b,c]はfalseです.
CharSetに文字'S'があるかどうか:
if'S'in CharSet then
//運転継続
以下のコードは、EnumSetにMondyがないかどうかを判断します.
if not(Monday in EnumSet)then
//運転継続
セットa:=[1..10];xはintegerであり、xがセットaにある要素xを削除すると、セットaに要素xを追加します.プログラムセグメントは以下の通りです.if x in a then a:=a-[x]else a:=a+[x]
セットにない直接演算:セット内の要素の個数およびプリント出力セットの各要素.
集合はPascal特有のデータタイプで、Visual Baic、C/C++がない(C++Buiderはテンプレートクラスを提供して集合になりますが、それはPascal集合の行為を模倣しました).集合は、順序、文字、列挙値のセットを有効な手段で表す.一つのセットをキーワードでset ofとして宣言し、その後に順序付けられたタイプまたは1つのセットは、すべての限定的なサブセットに値するかもしれない.例は以下の通りです
type
TCharSet = set of char; // #0 #255
TEnum = (Monday, Tuesday, Wednesday, Thursday, Friday);
TEnumSet = set of TEnum; // TEnum
TSubrangeset = set of 1..10; // :1~10
TAlphaSet = set of 'A'..'Z'; // :'A'、'B'...'Z'
一つのセットは最大255個の要素しかないことに注意してください.また、順序のあるタイプだけがキーワードset ofに対応することができますので、以下のコードは不正です.type
TIntSet = set of Integer; // ,
TStrSet = set of String; // ,
内部に集合してビットとしてその要素を保存することで、速度とメモリの利用がより効果的になる.セットが32個以下の要素であれば、CPUのレジスタに格納するほうが効率が高くなり、セットタイプでより効率的になる.セットの基本タイプの要素の数は32より小さいことを覚えてください.一、集合を使う
集合の要素を使用する場合は、四角い括弧を使用します.下のコードは、集合型の変数をどのように使用し、値を与えますか?
1.直接所在過程におけるvarの定義
var
SubrangeSet : set of 1..10; // 1 10
begin
SunrangeSet := [1,2,4..6];
end;
2.typeで定義するtype
TcharSet = set of char;
var
CharSet : TCharSet;
begin
CharSet :=['A'..'J','a','m'];
end;
二、集合の値
1.セットの値を相手の括弧に入れ、各要素はカンマで区切られます.例えば、[1,2,5]と[a',e',i']は集合です.
2.集合の中には何の要素もなくてもよい.このような集合を空セットと呼ぶ.空セット
3.集合において、要素の値が連続的であれば、サブ期型の表現法で表現することができる.例えば、[1,2,3,4,5,6,10,15]を[1.5,10,15]と表現しても良い.
4.集合の値は、括弧内の要素の出現の順序とは関係ありません.例えば[1,5,8]と[1,8,5]の値は等しいです.
5.集合中の同じ要素の繰り返しは、集合の値に影響を及ぼさない.例えば[1,8,5,1,8]と[1,5,8]の値が等しい.
6.各要素は基本タイプによって許容される表現で表現されます.[1,1+1,4]、[succ(ch)]のように
三、集合の演算
集合型変数は算術演算ができません.集合は無秩序ですので、ord、pred、succなどの関数は使えません.
1.割当演算
集合変数には、値を割り当てられた語句だけが与えられます.文章を読むことによって値が割り当てられません.また、文章を書くことによって、集合変数の値が直接出力されません.例えば:
:c:=['2']; i:=[5]; w:=[];
:c:=['a'..'z']; i:=[1..7];
:c:=['a','b','d','m'm]; i:=[1,2,4,5];
2.集合の同時、交、差演算各演算は1つの演算子と2つの演算オブジェクトだけで、結果はまだセットになります.一つは算術演算との違いです.
1)併算(関係代数演算子∪)
A、Bは2つのセットであり、セットAの要素にBと重複しないすべての要素からなるセットは、セットAとBの和となる.A+Bです
[X,Y,Z]+[X]は[X,Y,Z]{2つのセットで重複しないすべての要素}です.
[1]+[4]は[1,4]である.
+、−演算子またはInclude()とExclude()のプロセスを使って、1つのセット変数を削除することができます.
Include(CharSet, 'a'); // 'a'
CharSet := CharSet+['b']; // 'b'
Exclude(CharSet, 'x'); // 'x'
CharSet := CharSet-['y', 'z']; // 'y', 'z'
ヒント:要素をできるだけInclude()とExclude()で削除し、できるだけ+、-演算子を少なくします.Include()とExclude()は一つのマシン命令だけが必要なので、+と-は13+6 n(nはセットのビット長)本のマシン命令が必要です.2) 演算(関係代数演算子∩)
A、Bは2つの集合であり、集合Aに属し、集合Bに属する全ての要素からなる集合を集合AとBという.つまりA*Bです.
[X,Y,Z]*[X]は[X]{二つのセットの中の同じ要素}.
[X,Y,Z]*は[]です.
3)差分演算(関係代数演算子-)
A、Bは2つのセットであり、集合Aの要素から、集合Bの中のAと同じ要素からなる要素を除去し、集合AとBの差、すなわちA−Bと称する.
[X,Y,Z]-[X]は[Y,Z]{集合Aにおいて、集合Bにないすべての要素}である.
[X,Y,Z]-[X,Y,Z]
3.セットの関係演算:演算結果はブール値です.
関係演算子:
=等しい
<>等しくない
>=含む、前者は後者を含むという意味です.
<=は、前者が後者に含まれることを表す.
例えば、[a,b,c]=[b,c,a]はtrueであり、要素の個数は同じで、内容は同じであり、配列の順序にかかわらず.[a,b,c]=[a]はtrueです.[a,b]<=[a,b,c]はtrueです.
n演算:inの右側は集合で、左は集合ベースのタイプと同じ式で、ブール型です.nテストは、1つの要素がセットにあるかどうかです.集合論に当たる∈.これらはすべて2つの目演算であり、前の4つの演算子の演算対象はすべて互換性のあるセットタイプである.例えば、a in[b,c]はfalseです.
CharSetに文字'S'があるかどうか:
if'S'in CharSet then
//運転継続
以下のコードは、EnumSetにMondyがないかどうかを判断します.
if not(Monday in EnumSet)then
//運転継続
セットa:=[1..10];xはintegerであり、xがセットaにある要素xを削除すると、セットaに要素xを追加します.プログラムセグメントは以下の通りです.if x in a then a:=a-[x]else a:=a+[x]
セットにない直接演算:セット内の要素の個数およびプリント出力セットの各要素.