【问题标题】:How to fast copy from hash to listview?如何快速从哈希复制到列表视图?
【发布时间】:2010-10-21 09:29:51
【问题描述】:

有一个hash pas文件http://gpdelphiunits.googlecode.com/svn-history/r4/trunk/src/GpStringHash.pas

我们可以创建hash并添加key-value

问题 1: 我们想知道如何迭代key-value并将数据复制到listview。

问题2:有没有办法像assign方法一样快速复制?

非常感谢您。

亲爱的 gabr,非常感谢您的即时回复和您的哈希文件。您的代码是否有文档或帮助文件或示例或演示?再次感谢你。


只是测试,不知道哪里做错了 非常感谢。我刚刚使用了您的代码,但出现以下错误提示。或者我犯了一些错误:

procedure TForm8.ab;
var
  a: TGpStringHash;
  i,j, fr:integer;
  k: string;
  enlist: TGpStringHashenumerator;
  kv: TGpStringHashKV;
begin
  a:=TGpStringHash.Create;
  kv:=TGpStringHashKV.Create;
  enlist:= TGpStringHashenumerator.Create(a);
  for j:=1 to 10 do begin
    if a.HasKey(inttostr(j)) then begin
      fr:=a.ValueOf(inttostr(j));
      a.Update(inttostr(j),fr+1);
    end
    else begin
      a.Add(inttostr(j),1);
    end;
  end;
  for i:=0 to a.Count -1 do begin
    kv:=enlist.GetCurrent;
    memo1.Lines.Add(kv.Key + inttostr(kv.value) );
  end;
end; /// Division by Zero ERROr ///FindBucket(const key: string): cardinal;

回答: 您不正确地使用枚举器。不要在前面实例化它,总是使用 MoveNext 移动到下一个元素。

// fill 'a' as above
enlist := TGpStringHashenumerator.Create(a);
while enList.MoveNext do begin
  kv:=enlist.GetCurrent;
  memo1.Lines.Add(kv.Key + inttostr(kv.value) );
end;

【问题讨论】:

  • 不要使用 TGpStringHash 的无参数构造函数。始终至少将哈希中的初始元素数量传递给 Create。
  • 还是因为delphi版本不同?
  • 我们将 Create 构造函数改为:a:=TGpStringHash.Create (num, true);//with param.没有错误提示,但是 memo1 生成的数据是一样的:都是'-1'。请告诉我们如何更改。

标签: delphi


【解决方案1】:

1) 使用latest version。它为所有容器实现枚举器。

2) 没有。

编辑:

我已将我的内部 GpStringHash 测试应用程序提交到存储库。它可以作为如何使用 GpStringHash 类的演示。

要枚举您将使用的 TGpStringHash

var
  hash: TGpStringHash;
  kv: TGpStringHashKV;

for kv in hash do
  // do something with kv.Key and kv.Value

如果您使用的是不支持枚举器的旧版 Delphi,则可以将 ForEach 方法与外部回调方法一起使用。

procedure TGpStringHash.ForEach(enumerator: TGpStringHashEnumMethod);
var
  enum: TGpStringHashEnumerator;
begin
  enum := GetEnumerator;
  try
    while enum.MoveNext do
      enumerator(enum.Current);
  finally FreeAndNil(enum); end;
end; { TGpStringHash.ForEach }

【讨论】:

  • 亲爱的 gabr, 非常感谢您的即时回复和您的哈希文件。您的代码是否有文档或帮助文件或示例或演示?再次感谢您。
  • 更新:示例/演示现在存储在 SVN 中。
  • 非常感谢。我刚刚使用了你的代码,但是有以下错误提示。或者我犯了一些错误:
  • 程序 TForm1.ab;变量 i,j,fr:整数; k:字符串;征募:TGpStringHashenumerator; kv: TGpStringHashkv;开始 a:=TGpStringHash.Create ; kv:=TGpStringHashkv.创建;征募:= TGpStringHashenumerator.Create(a);对于 j:=1 到 10,如果 a.HasKey(inttostr(j)) 然后开始 fr:=a.ValueOf(inttostr(j)); a.Update(inttostr(j),fr+1); end else begin a.Add(inttostr(j),1);结尾;结尾; for i:=0 to a.Count -1 do begin kv:=enlist.GetCurrent ; memo1.Lines.Add(kv.Key + inttostr(kv.value) );结尾;结束;
  • 除以零错误 ///FindBucket(const key: string): cardinal;
猜你喜欢
  • 2012-07-17
  • 2011-01-04
  • 2014-02-01
  • 2014-08-18
  • 2011-04-09
  • 2016-08-29
  • 2013-01-10
  • 2012-12-25
  • 2010-10-04
相关资源
最近更新 更多