2009-03-03 12 views
0

我使用JvMemoryData來填充JvDBUltimGrid。我主要使用這個JvMemoryData作爲數據結構,因爲我不知道其他任何能滿足我需求的東西。如何枚舉JvMemoryData ...或者,如何使用單個鍵和多個值創建散列?

我沒有使用大量的數據,但我確實需要一種方法來枚舉我添加到JvMemoryData的記錄。有沒有人做過這個?是否有可能以某種方式使用TSQLQuery「查詢」這些數據?

或者,有沒有更好的方法來做到這一點?在數據結構方面,我有點天真,所以也許有人可以指出我正確的方向。我真正需要的是像Dictionary/Hash,它允許1個關鍵值和許多值。像這樣:

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

我認爲在IniFiles單元使用THashedStringList,但它仍然從同一個問題的困擾,因爲它僅允許1鍵與一個值相關聯。

回答

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

我不是Delphi程序員,但你不能只是使用列表或數組作爲每個哈希項的值?在Java中的術語:

Map<String,List> 
+0

我會研究一下。這聽起來像我想要的。 – Mick 2009-03-03 19:57:27

+0

是的,如果你有D2009,你可以做TDictionary或TObjectDictionary。 – 2009-03-03 21:50:39

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; 

我已經越來越看似即時訪問這種方式。

傑克

1

您似乎已經在使用Jedi了。 Jedi包含允許你用任何東西映射任何東西的類。

看看這個related question

相關問題