如何枚举JvMemoryData ...或者,如何使用单个键和多个值创建哈希?

时间:2009-03-03 19:40:33

标签: delphi data-structures hash

我正在使用JvMemoryData来填充JvDBUltimGrid。我主要使用这个JvMemoryData作为数据结构,因为我不知道有什么能满足我的需求。

我没有使用大量数据,但我确实需要一种方法来枚举我添加到JvMemoryData的记录。有没有人这样做过?是否可以使用TSQLQuery以某种方式“查询”此数据?

或者,有更好的方法吗?在数据结构方面我有点天真,所以也许有人可以指出我正确的方向。我真正需要的是一个Dictionary / Hash,它允许1个键和许多值。像这样:

KEY1: val1;val2;val3;val4;val5;etc...
KEY2: val1;val2;val3;val4;val5;etc...

我考虑在IniFiles单元中使用THashedStringList,但它仍然遇到同样的问题,因为它只允许一个键与一个值相关联。

4 个答案:

答案 0 :(得分:2)

一种方法是创建一个TStringList,并让每个项目的对象指向另一个包含所有值的TList(或TStringList)。如果对最上面的字符串列表进行排序,则检索只是二进制搜索。

要将项目添加到最上面的列表,请使用以下内容(SList = TStringList):

Id := SList.AddObject( Key1, tStringList.Create );
InnerList := tStringList(SList.Objects[id]);
// for each child in list
  InnerList.add( value );

当处理列表时,请确保释放每个内部列表。

for i := 0 to SList.count-1 do
  begin
    if Assigned(SList.Objects[i]) then
      SList.Objects[i].free;
    SList.Objects[i] := nil;
  end;
FreeAndNil(SList);

答案 1 :(得分:1)

我不是Delphi程序员,但你不能只使用列表或数组作为每个哈希条目的值吗?在Java术语中:

Map<String,List>

答案 2 :(得分:1)

你似乎已经在使用绝地了。 Jedi包含允许您用任何东西映射任何东西的类。

看看这个related question

答案 3 :(得分:0)

我一直在使用任意任意复杂的用户定义记录类型的数组作为缓存以及TStringList或THashedStringList。我使用密钥访问每条记录。首先,我检查字符串列表中的匹配项。如果没有匹配,那么我从数据库中获取记录并将其放入数组中。我将其数组索引放入字符串列表中。使用我正在使用的记录,这就是我的代码:

function TEmployeeCache.Read(sCode: String): TEmployeeData;
var iRecNo: Integer;
    oEmployee: TEmployee;
begin
  iRecNo := CInt(CodeList.Values[sCode]);
  if iRecNo = 0 then begin
    iRecNo := FNextRec;
    inc(FNextRec);
    if FNextRec > High(Cache)  then SetLength(Cache, FNextRec * 2);
    oEmployee := TEmployee.Create;
    oEmployee.Read(sCode);
    Cache[iRecNo] := oEmployee.Data;
    oEmployee.Free;
    KeyList.Add(Format('%s=%s', [CStr(Cache[iRecNo].hKey), IntToStr(iRecNo)]));
    CodeList.Add(Format('%s=%s', [sCode, IntToStr(iRecNo)]));
  end;
  Result := Cache[iRecNo];
end;

我一直在以这种方式看似即时访问。

杰克