由于贪图方便,用了tstringlist的commandtext去分割字符串~现在问题来了,tstringlist对于集合中的in运算好像有点不能用,例如tstringlist里面有字符串,(1,2,3,4),一string集合是(1,2,3),两者之间怎么用in运算呢请指教,谢谢回复
解决方案 »
- 当对象作为函数或过程的参数的时候, 如何避免使用默认的引用传递方式, 改为值传递????
- 请问大家jndy的问题
- ShellExecute调用外部程序的问题(急)
- 使用 TMediaPlayer 如何消掉原音
- 如果自己做一个安装程序?难道只能用install shell吗?
- 求delphi的例子,以及教程
- 当label1.Caption:='A'时。StrPcopy(@C,label1.Caption)与C:='A'有什么不同!高手指点!?
- 初学者提问 delphi 中table 怎么实现多条件查询
- 请问哪位兄台知道通过一个程序来随时改变电脑上的硬盘的占用空间。比如说我们输入C盘、80%,就可以实现C盘占用这么多空间。最好是不要通过
- 如何用ado访问vfp的带有memo字段的表(*.dbf)呀?
- 控件开发
- 用tidhttp抓取网页时出现乱码,而且还不是总出,有时正常,求助
首先数据库里面读到的数据是以“,”分割的一系列字符串,例如“a,b,c,d”,那么怎么判断以下情况?
1、“a,b”存在于“a,b,c,d”中为真
2、“a,b,e”与“a,b,c,d”交集不为空时为真
寻求类似的权限组算法按2楼的说法,查找子串应该不能做到第2点吧?请指教
function Test(Str1, Str2 : string): boolean;
var
Set1, Set2 : Set of Char;
I : integer;
begin
Set1 := [];
Set2 := [];
for I := 1 to Length(Str1) do
Set1 := Set1 + [Str1[I]];
for I := 1 to Length(Str2) do
Set2 := Set2 + [Str2[I]];
Result := Set2 * Set1 <> [];
end;procedure TForm1.Button1Click(Sender: TObject); {以下给出三个测试}
var
Str1, Str2 : string;
begin
Str1 := 'abcdefg';
Str2 := 'aef';
if Test(Str1, Str2) then Showmessage('No.1 交集不为空');
Str1 := 'e';
Str2 := 'aef';
if Test(Str1, Str2) then Showmessage('No.2 交集不为空');
Str1 := '1234';
Str2 := 'abcd';
if Test(Str1, Str2) then Showmessage('No.3 交集不为空');
end;
如果你期望的“集合”的每个“元素”都是一个“字符串”而不是“字符”,那就不好办喽
数字字符只有10个,英文字符也只有26个
所以我才想到用字符串加“,”来分割,用tstringlist的commandtext把权限的标识分开,谁知道单个用没问题,问题竟然出在判断交集这一步了……有没有办法是能够
var
set1:set of string
这样?
肯定不行的。因为:
1、string的名字是一个指针(指针不指针倒也无所谓,关键是2)
2、Set类型,在内存中,是一个1-32个字节的内存块,也就是说,一个集合,最大就是32个字节,即256位。它用每一个位值的0或1表示序数0-255是否存在于集合中。
因此说,用集合表示0-255之外的数集,是不可能的。但是,你可以换个思路:
还是用TStringList,对每个字串进行字符排序、去除重复字符,然后再用Pos函数或其它方法查找某字串是否包含某字串
要用循环的。
1、string的名字是一个指针(指针不指针倒也无所谓,关键是2)
2、Set类型,在内存中,是一个1-32个字节的内存块,也就是说,一个集合,最大就是32个字节,即256位。它用每一个位值的0或1表示序数0-255是否存在于集合中。
因此说,用集合表示0-255之外的数集,是不可能的。 但是,你可以换个思路:
还是用TStringList,对每个字串进行字符排序、去除重复字符,然后再用Pos函数或其它方法查找某字串是否包含某字串
要用循环的。备注:In只能操作序数类型
比如2.那就把"a,b,e"用TStringList分割,然后循环,"a"在不在"a,b,c,d"里,"b"在不在......
function StrIn(SubStr, S: string): Boolean;
var
i: Integer;
SubList, List: TStringList;
begin
Result := True;
SubList := TStringList.Create;
List := TStringList.Create;
try
SubList.CommaText := SubStr;
List.CommaText := S;
for i := 0 to SubList.Count - 1 do
begin
if List.IndexOf(SubList[i]) = -1 then
begin
Result := False;
Exit;
end;
end;
finally
List.Free;
SubList.Free;
end;
end;
var
i: Integer;
List1, List2: TStringList;
begin
Result := False;
List1 := TStringList.Create;
List2 := TStringList.Create;
try
List1.CommaText := S1;
List2.CommaText := S2;
for i := 0 to List1.Count - 1 do
begin
if List2.IndexOf(List1[i]) <> -1 then
begin
Result := True;
Exit;
end;
end;
finally
List2.Free;
List1.Free;
end;
end;