由于贪图方便,用了tstringlist的commandtext去分割字符串~现在问题来了,tstringlist对于集合中的in运算好像有点不能用,例如tstringlist里面有字符串,(1,2,3,4),一string集合是(1,2,3),两者之间怎么用in运算呢请指教,谢谢回复

解决方案 »

  1.   

    两者使不能使用in操作的,你要字符串函数来判断,TStringList.Text可以返回TStringList中的字符串。
      

  2.   

    那这个问题我再说具体点,其实就是一个权限与权限组的问题
    首先数据库里面读到的数据是以“,”分割的一系列字符串,例如“a,b,c,d”,那么怎么判断以下情况?
    1、“a,b”存在于“a,b,c,d”中为真
    2、“a,b,e”与“a,b,c,d”交集不为空时为真
    寻求类似的权限组算法按2楼的说法,查找子串应该不能做到第2点吧?请指教
      

  3.   

    如果要的是下面这样的结果,就好办了:
    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;
    如果你期望的“集合”的每个“元素”都是一个“字符串”而不是“字符”,那就不好办喽
      

  4.   

    没说完:上面函数中,只是用交集运算进行了演示.也就是说,如果两个集合有相交的元素,函数就返回True;如果两个集合相交结果为空集,函数就返回False函数中, 将两个字符串各“转换”为一个字符集合,也就是说,没有用TStrings的思路。但愿你要的就是这种结果 ^_^
      

  5.   

    谢谢楼上提供思路,但如果只用字符来做而不用字符串的话,可能不够用
    数字字符只有10个,英文字符也只有26个
    所以我才想到用字符串加“,”来分割,用tstringlist的commandtext把权限的标识分开,谁知道单个用没问题,问题竟然出在判断交集这一步了……有没有办法是能够
    var 
       set1:set of string
    这样?
      

  6.   

    set of string是不行的……
      

  7.   


    肯定不行的。因为:
    1、string的名字是一个指针(指针不指针倒也无所谓,关键是2)
    2、Set类型,在内存中,是一个1-32个字节的内存块,也就是说,一个集合,最大就是32个字节,即256位。它用每一个位值的0或1表示序数0-255是否存在于集合中。
    因此说,用集合表示0-255之外的数集,是不可能的。但是,你可以换个思路:
    还是用TStringList,对每个字串进行字符排序、去除重复字符,然后再用Pos函数或其它方法查找某字串是否包含某字串
    要用循环的。
      

  8.   

    肯定不行的。因为: 
    1、string的名字是一个指针(指针不指针倒也无所谓,关键是2) 
    2、Set类型,在内存中,是一个1-32个字节的内存块,也就是说,一个集合,最大就是32个字节,即256位。它用每一个位值的0或1表示序数0-255是否存在于集合中。 
    因此说,用集合表示0-255之外的数集,是不可能的。 但是,你可以换个思路: 
    还是用TStringList,对每个字串进行字符排序、去除重复字符,然后再用Pos函数或其它方法查找某字串是否包含某字串 
    要用循环的。备注:In只能操作序数类型
      

  9.   


    比如2.那就把"a,b,e"用TStringList分割,然后循环,"a"在不在"a,b,c,d"里,"b"在不在......
      

  10.   

    给你一个函数,不过性能一般
    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;
      

  11.   

    function StrMixed(S1, S2: string): Boolean;
    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;