求某个集合中元素的个数(10分)

  • 主题发起人 主题发起人 learnlife
  • 开始时间 开始时间
L

learnlife

Unregistered / Unconfirmed
GUEST, unregistred user!
是否有函数可以调用,或者如何实现求这个个数问题呢?
 
.count
应该就行了吧.
 
用两次SizeOf函数,第一次用SizeOf求出集合中第一个元素的大小(内存占用数);第二次用SizeOf求出整个集合的大小(内存占用数);最后用第二次的值 DIV 第一次的值应该就是集合中的元素数目了...
 
.count是什么,可行吗?
 
呵呵,不可行,这是得到你的记录数.刚才没看清楚.
 
你是要得到维数.
 
select conunt(id) form table
 
不是我的集合指的是Pascal中的集合类型,例如[5,6,7,8]
 
啊?你说的是数组啊???????????????????????????
 
Object Pascal中有集合类型,我说的不是数组,是集合
 
采用了Johnny_du的方法,真希望系统中有求集合元素个数的函数
 
没有这种函数的。
有个办法,给你个例子:
type
TEnum=(a,b,c,d);//如果你的是子界类型也一样;
TSet=set of TEnum;

const COUNT=4;
...
...
function GetSetCount(ASet:TSet):integer;
var i:integer;
begin
i:=0;
result:=0;
if TEnum(i) in ASet then Result:=Result+1;
end;
 
啊哦,错了
type
TEnum=(a,b,c,d);//如果你的是子界类型也一样;
TSet=set of TEnum;

const COUNT=3;
...
...
function GetSetCount(ASet:TSet):integer;
var i:integer;
begin
result:=0;
for i:=0 to COUNT do
if TEnum(i) in ASet then Result:=Result+1;
end;
 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//得到集合变量包含的元素输
//参数1:集合变量的指针
//注释:传递指针是想能够为任何集合类型计算.不必绑死到固定某个集合类型
//参数2:集合类型的大小
//注释:集合在内部是位运算.集合最多256个元素.因此集合是1-32个字节的类型,长度视集合类型的总元素个数而定.所以要给一个集合类型大小
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Function GetSetCount(AnySetPointer:Pointer
const SizeofSet:Integer):Integer;
var
I ,j:Integer;
PB: PByte;
C: Byte;
begin
Result := 0;
PB := AnySetPointer;
for I := 0 to SizeofSet -1 do //对其本身及后的共SizeofSet个字节进行位运算
begin
C := $1;
for J := 0 to $F do //检测位是不是1,1表示包含次元素,0表示不包含
begin
if (C and PB^ = C) then
Inc(Result);
C := C shl 1;
if C = 0 then //移位出头了,就是0
break;
end;
Inc(PB);
end;
end;

用法如下:
type
TSS = set of char;
var
ss:tss;
I: Integer;
begin

SS := ['a'];
ss := SS + ['c'..'k'];
I := GetSetCount(@SS, SizeOf(TSS))
//获取集合变量元素总数
ShowMessage('ss包含元素数量是:'+IntToStr( I));
end;
 
如果要是求集合类型中全部元素的话就
Szieof(集合类型)*8
就行了.上面说了,集合就是位运算.每个元素占一个位.最多一个字节能表示8个集合元素.
所以乘8
 
考,楼上的,他要的是集合变量的元素个数,不是集合类型的所有元素个数,汗
 
楼上的挺没礼貌啊。
你好好看看。我连发两贴,
第一铁就是得到集合变量中的元素个数。
第二铁是集合类型包含的总个数
 
wr960204的方法真是不错
我试了下,还可以再简单点,:)

type
TSets = set of (ssA, ssB, ssC, ssD);

function GetSetCount(const V): Byte;
var
D: Byte;
begin
Result := 0;
D := PByte(@V)^;
while D <> 0 do
begin
if D and 1 = 1 then
Inc(Result);
D := D shr 1;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
V: TSets;
begin
V := [ssA, ssB, ssD];
Caption := IntToStr(GetSetCount(V));
end;
 
我的方法就差了吗!!!!
 
hbwin2001的方法倒是没有错。但是你的方法绑死了指定的集合类型。而我的则是通用的
 
后退
顶部