我有一组数据(自定义结构体中的一项),
我如何把其中相同的项名称取到(直接拿到),还有此名称重复的次数???
最好有一例子!!!
例如:
     一组数据为:A,A,A,A,B,B,B,B,B,B,B,B,C,C
     我需要提取A,B,C三项和它们各自出现的次数??????????
越快越好!!!

解决方案 »

  1.   

    var sl :TStringList;
    a:array of string;//A,A,B,B,C,........sl := TStringList.Create;
    for i:=Low(a) to High(a) do
      sl.Values[s[i]] := IntToStr(StrToIntDef(sl.Values[s[i]],0) + 1);
    sl.Free;
      

  2.   

    to riqiang:可以举个例子吗?谢谢!!!循环我用不好!to windindance:可以对代码稍做解释一下吗?我不太明白?万分感谢!!!
      

  3.   

    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    type
      TElement = Record
        FsElement: string;
        FiCount: integer;
      end;
      TArrElement = array of TElement;  TForm2 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure SubSumCount(arrStr: array of string;var arrElement: TArrElement);
      end;var
      Form2: TForm2;implementation{$R *.dfm}{ TForm2 }procedure TForm2.SubSumCount(arrStr: array of string;
      var arrElement: TArrElement);
    var
      i,j:integer;
      bFlag:boolean;
    begin
      SetLength(arrElement,0);
      for i := Low(arrStr) to High(arrStr) do
      begin
        bFlag := False;
        for j := Low(arrElement) to High(arrElement) do
        begin
          if arrStr[i]=arrElement[j].FsElement then
          begin
            Inc(arrElement[j].FiCount);
            bFlag := True;
            break;
          end;
        end;
        if not bFlag then
        begin
          SetLength(arrElement,High(arrElement)-Low(arrElement)+2);
          arrElement[High(arrElement)].FsElement :=arrStr[i];
          arrElement[High(arrElement)].FiCount :=1;
        end;
      end;
    end;procedure TForm2.Button1Click(Sender: TObject);
    var
      i:integer;
      astr:array of string;
      arrEle: TArrElement;
    begin
      SetLength(aStr,14);
      i:=0;
      aStr[i] := 'A';
      inc(i);
      aStr[i] := 'A';
      inc(i);
      aStr[i] := 'A';
      inc(i);
      aStr[i] := 'A';
      inc(i);
      aStr[i] := 'B';
      inc(i);
      aStr[i] := 'B';
      inc(i);
      aStr[i] := 'B';
      inc(i);
      aStr[i] := 'B';
      inc(i);
      aStr[i] := 'B';
      inc(i);
      aStr[i] := 'B';
      inc(i);
      aStr[i] := 'B';
      inc(i);
      aStr[i] := 'B';
      inc(i);
      aStr[i] := 'C';
      inc(i);
      aStr[i] := 'C';
      SubSumCount(aStr,arrEle);
      for i := Low(arrEle) to High(arrEle) do
      begin
        Memo1.Lines.Add(arrEle[i].FsElement + ':' + IntToStr(arrEle[i].FiCount));
      end;
    end;end.
      

  4.   

    先谢谢大家!!!但我不知道这组数据里的元素是什么?也就是说我不知道这组数据中有A,B或C,这只是假定
    我要得到这组数据里有哪些数据和各个数据出现的次数!!!拜托各位了!!!很急!
      

  5.   

    andrew223(暴风雪) 的代码SubSumCount不就是你要的吗。
    如果数组比较大,要提高效率,可以在第二重循环的部分修改成hash算法。