码迷,mamicode.com
首页 > 其他好文 > 详细

TStringList 与 泛型字典TDictionary 的 哈希功能效率PK

时间:2017-04-25 10:15:09      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:dial   creat   lin   values   lines   set   nal   form   ted   

结论:做HashMap 映射 功能的时候 ,字典TDictionary 功能更强大,且效率更高,比如不仅仅可以存String,还可以存结构和类。

 

技术分享

 

unit Unit5;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Generics.Collections;

type
  TForm5 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  /// <summary>
  ///  第一种方法:
  ///  班级类,班级里有多个人,这里类里内置好每个人的英文名字和中文名字的映射
  ///  通过英文名字可以找到中文,通过中文名字也可以找到英文
  /// </summary>
  TBanJi111 = class
    const
      /// <summary>
      /// 这叫类常量,可以把人名 英文---->中文 定义在这里
      /// </summary>
      studentNameEnToCnListStr = XiaoLi=李飞刀,XiaoWang=王中王,XiaoZhang=张飞;
    public
      /// <summary>
      ///  通过英文获取中文的方法
      /// </summary>
      function getNameCnByEn(const nameEn: string): string;

      /// <summary>
      /// 通过中文获取应该的方法
      /// </summary>
      function getNameEnByCn(const nameCn: string): string;
  end;

  /// <summary>
  ///  第二种方法:
  ///  用2个TStringList属性,
  ///  key,value做下置换
  /// </summary>
  TBanJi222 = class
  private
    FNameEnToCnList: TStringList;
    FNameCnToEnList: TStringList;
    procedure SetNameCnToEnList(const Value: TStringList);
    procedure SetNameEnToCnList(const Value: TStringList);
  public
    constructor Create;
    destructor Destroy; override;
    property NameCnToEnList: TStringList read FNameCnToEnList write SetNameCnToEnList;
    property NameEnToCnList: TStringList read FNameEnToCnList write SetNameEnToCnList;
  end;


  /// <summary>
  /// 第三种方法
  /// 用泛型
  /// </summary>
  TBanJi333 = class
  private
    FNameEnToCnMap: TDictionary<string, string>;
    FNameCnToEnMap: TDictionary<string, string>;
    procedure SetNameCnToEnMap(const Value: TDictionary<string, string>);
    procedure SetNameEnToCnMap(const Value: TDictionary<string, string>);
  public
    constructor Create;
    destructor Destroy; override;
    property NameCnToEnMap: TDictionary<string, string> read FNameCnToEnMap write SetNameCnToEnMap;
    property NameEnToCnMap: TDictionary<string, string> read FNameEnToCnMap write SetNameEnToCnMap;
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.Button1Click(Sender: TObject);
var
  bb: TBanJi111;
  I: Integer;
  start_miao: Int64;
  response1, response2: string;
begin
  bb := TBanJi111.Create;
  try
    //看下结果
    Memo1.Lines.Clear;
    Memo1.Lines.Add(bb.getNameCnByEn(XiaoLi));
    Memo1.Lines.Add(bb.getNameEnByCn(李飞刀));

    //循环测试性能
    start_miao := GetTickCount;
    for I := 0 to 100000 do
    begin
      //通过英文取中文
      response1 := bb.getNameCnByEn(XiaoLi);
      //通过中文取英文
      response2 := bb.getNameEnByCn(李飞刀);
    end;
    Memo1.Lines.Add(总耗时(毫秒):  + (GetTickCount - start_miao).ToString);
  finally
    bb.Free;
  end;
end;

{ TBanJi }

function TBanJi111.getNameCnByEn(const nameEn: string): string;
var
  MyList: TStringList;
begin
  MyList := TStringList.Create;
  try
    MyList.CommaText := studentNameEnToCnListStr;
    Result := MyList.Values[nameEn];
  finally
    MyList.Free;
  end;
end;

function TBanJi111.getNameEnByCn(const nameCn: string): string;
var
  MyList: TStringList;
  I: Integer;
begin
  MyList := TStringList.Create;
  try
    MyList.CommaText := studentNameEnToCnListStr;
    for I := 0 to (MyList.Count - 1) do
    begin
      if nameCn = MyList.ValueFromIndex[I] then
      begin
        Result := MyList.Names[I];
        Break;
      end;
    end;
  finally
    MyList.Free;
  end;
end;

{ TBanJi2 }

constructor TBanJi222.Create;
var
  I: Integer;
begin
  inherited Create;
  Self.FNameEnToCnList := TStringList.Create;
  Self.FNameCnToEnList := TStringList.Create;
  //把项目逐条加载进来
  Self.FNameEnToCnList.Add(XiaoLi=李飞刀);
  Self.FNameEnToCnList.Add(XiaoWang=王中王);
  Self.FNameEnToCnList.Add(XiaoZhang=张飞);
  //key与value反转写入另一个TStringList
  for I := 0 to Self.FNameEnToCnList.Count - 1 do
  begin
   Self.FNameCnToEnList.Add(Self.FNameEnToCnList.ValueFromIndex[I] + = + Self.FNameEnToCnList.Names[I]);
  end;
end;

destructor TBanJi222.Destroy;
begin
  Self.FNameEnToCnList.Free;
  Self.FNameCnToEnList.Free;
  inherited Destroy;
end;

procedure TBanJi222.SetNameCnToEnList(const Value: TStringList);
begin
  FNameCnToEnList := Value;
end;

procedure TBanJi222.SetNameEnToCnList(const Value: TStringList);
begin
  FNameEnToCnList := Value;
end;

procedure TForm5.Button2Click(Sender: TObject);
var
  bb: TBanJi222;
  I: Integer;
  start_miao: Int64;
  response1, response2: string;
begin
  bb := TBanJi222.Create;
  try
    //看下结果
    Memo1.Lines.Clear;
    Memo1.Lines.Add(bb.NameEnToCnList.Values[XiaoLi]);
    Memo1.Lines.Add(bb.NameCnToEnList.Values[李飞刀]);

    //循环测试性能
    start_miao := GetTickCount;
    for I := 0 to 100000 do
    begin
      //通过英文取中文
      response1 := bb.NameEnToCnList.Values[XiaoLi];
      //通过中文取英文
      response2 := bb.NameCnToEnList.Values[李飞刀];
    end;
    Memo1.Lines.Add(总耗时(毫秒):  + (GetTickCount - start_miao).ToString);
  finally
    bb.Free;
  end;
end;

procedure TForm5.Button3Click(Sender: TObject);
var
  bb: TBanJi333;
  I: Integer;
  start_miao: Int64;
  response1, response2: string;
begin
  bb := TBanJi333.Create;
  try
    //看下结果
    Memo1.Lines.Clear;
    Memo1.Lines.Add(bb.NameEnToCnMap[XiaoLi]);
    Memo1.Lines.Add(bb.NameCnToEnMap[李飞刀]);

    //循环测试性能
    start_miao := GetTickCount;
    for I := 0 to 100000 do
    begin
      //通过英文取中文
      response1 := bb.NameEnToCnMap[XiaoLi];
      //通过中文取英文
      response2 := bb.NameCnToEnMap[李飞刀];
    end;
    Memo1.Lines.Add(总耗时(毫秒):  + (GetTickCount - start_miao).ToString);
  finally
    bb.Free;
  end;
end;

procedure TForm5.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown := True;
end;

{ TBanJi333 }

constructor TBanJi333.Create;
var
  myKey: string;
begin
  inherited Create;
  Self.FNameEnToCnMap := TDictionary<string, string>.Create();
  Self.FNameCnToEnMap := TDictionary<string, string>.Create();

  //把项目逐条加载进来
  Self.FNameEnToCnMap.Add(XiaoLi, 李飞刀);
  Self.FNameEnToCnMap.Add(XiaoWang, 王中王);
  Self.FNameEnToCnMap.Add(XiaoZhang, 张飞);

  //key与value反转写入另一个TDictionary
  for myKey in Self.FNameEnToCnMap.Keys do
  begin
   Self.FNameCnToEnMap.Add(Self.FNameEnToCnMap[myKey], myKey);
  end;
end;

destructor TBanJi333.Destroy;
begin
  Self.FNameEnToCnMap.Free;
  Self.FNameCnToEnMap.Free;
  inherited Destroy;
end;

procedure TBanJi333.SetNameCnToEnMap(const Value: TDictionary<string, string>);
begin
  FNameCnToEnMap := Value;
end;

procedure TBanJi333.SetNameEnToCnMap(const Value: TDictionary<string, string>);
begin
  FNameEnToCnMap := Value;
end;

end.

 

TStringList 与 泛型字典TDictionary 的 哈希功能效率PK

标签:dial   creat   lin   values   lines   set   nal   form   ted   

原文地址:http://www.cnblogs.com/del88/p/6760173.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!