如何遍历一个集合(20分)

  • 主题发起人 主题发起人 xgwzw
  • 开始时间 开始时间
X

xgwzw

Unregistered / Unconfirmed
GUEST, unregistred user!
问一个基础的问题
请问如何遍历一个集合
m:=[1,3,5,7,9];
怎样得到这个S,
保存在S:='[1,3,5,7,9]'
 
你是指集合还是数组?

集合是一组数字,其从类型 0 ~ 集合的最大值,要取得集合元素的具体名称可以用RTTI,但是集合本身只是一组数字而已,应该用 high 也可以判断边界吧,以前在D用RTTI取过集合的名称,但没用过high来判断,试试吧
 
是集合 不是数组
 
只能先确定集合里的值一定在某个范围类,比如1到100,然后
for i:=1 to 100 do
if i in m then ...
这样来判断
 
也就是要穷举了啊
 
如果是随便给定的一个集合,还好象真不容易作到哎!无法把象[aa,bb,cc]这样的集合返回成‘[aa,bb,cc]’,因为程序里AA是用位表示的。

但如果是一个类的PUBLISHED的属性,就可以返回如上的字符串。
 
当然如果是自己做的程序,就一定可以做到了!对应枚举值定义一个字符串数组就可以了
TORD=(1A,3C,5E,7G,9I,11K)
ORDSTRING:ARRAY[TORD] OF STRING=(‘1A’,‘3C’,‘5E’,‘7G’,‘9I’,‘11K’);

TORDSET=SET OF TORD;

M:TORDSET
S:STRING;

m:=[1,3,5,7,9];
S:=’[‘;
FOR I:=1A TO 11K DO
BEGIN
IF I IN m THEN S:=S+ORDSTRING
.......
END;
 
to wk_knife
请问你测试过没有
 
利用RTTI非常简单!既然看到了就帮下

见: TypInfo.pas 下的SetToString函数对对象的集合属性输出。

如果你要对某个集合变量输出,那么就需要我写的这个函数:
function SetToString(TheEnumTypeInfo: PTypeInfo
Value: Integer
Brackets: Boolean = False): string;
var
S: TIntegerSet;
I: Integer;
begin
Result := '';
Integer(S) := Value;
for I := 0 to SizeOf(Integer) * 8 - 1 do
if I in S then
begin
if Result <> '' then
Result := Result + ',';
Result := Result + GetEnumName(TheEnumTypeInfo, I);
end;
if Brackets then
Result := '[' + Result + ']';
end;

使用方法:

type
TMyEnum = (one, two, three);
TMySet = set of TMyEnum;

var
a: TMySet = [one, two];
s: string;

s := SetToString(TypeInfo(TMyEnum), Byte(a), True);
 
多人接受答案了。
 
我的是随手写的!大概就是这样的,
当然TORD=(1A,3C,5E,7G,9I,11K)
的定义是不符规范的,要出错,只是意思一下。
 
后退
顶部