結論:
做HashMap 映射 功能的時候 ,字典TDictionary 功能更強大,且效率更高,比如不僅僅可以存String,還可以存結構和類。
TDictionary類是一個name,value容器,内部是哈希索引,是以對于資料查找非常高效.
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, UListMap;
type
TForm5 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button4Click(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;
/// <summary>
/// 第四種方法
/// 用我自己封裝的有序的泛型字典
/// </summary>
TBanJi444 = class
private
FNameEnToCnMap: TListMap<string, string>;
FNameCnToEnMap: TListMap<string, string>;
procedure SetNameCnToEnMap(const Value: TListMap<string, string>);
procedure SetNameEnToCnMap(const Value: TListMap<string, string>);
public
constructor Create;
destructor Destroy; override;
property NameCnToEnMap: TListMap<string, string> read FNameCnToEnMap write SetNameCnToEnMap;
property NameEnToCnMap: TListMap<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.Button4Click(Sender: TObject);
var
bb: TBanJi444;
I: Integer;
start_miao: Int64;
response1, response2: string;
begin
bb := TBanJi444.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;
{ TBanJi444 }
constructor TBanJi444.Create;
var
myKey: string;
begin
inherited Create;
Self.FNameEnToCnMap := TListMap<string, string>.Create();
Self.FNameCnToEnMap := TListMap<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 TBanJi444.Destroy;
begin
Self.FNameEnToCnMap.Free;
Self.FNameCnToEnMap.Free;
inherited Destroy;
end;
procedure TBanJi444.SetNameCnToEnMap(const Value: TListMap<string, string>);
begin
FNameCnToEnMap := Value;
end;
procedure TBanJi444.SetNameEnToCnMap(const Value: TListMap<string, string>);
begin
FNameEnToCnMap := Value;
end;
end.