Wie aufzählen ich JvMemoryData ... Oder wie kann ich einen Hash mit einem einzigen Schlüssel und mehr Werten schaffen?

StackOverflow https://stackoverflow.com/questions/607820

  •  03-07-2019
  •  | 
  •  

Frage

Ich bin mit JvMemoryData eine JvDBUltimGrid zu füllen. Ich bin in erster Linie dieser JvMemoryData als Datenstruktur verwenden, weil ich an nichts anderes bewusst bin, dass meine Bedürfnisse erfüllt.

Ich bin nicht mit vielen Daten zu arbeiten, aber ich habe eine Art und Weise muß die Datensätze aufzuzählen ich JvMemoryData bin hinzufügen. Hat jemand dies getan, bevor? Wäre es möglich, TSQLQuery irgendwie „Abfrage“ diese Daten verwenden?

Oder gibt es einen besseren Weg, dies zu tun? Ich bin ein bisschen naiv, wenn es um Datenstrukturen kommt, so vielleicht kann mir jemand in die richtige Richtung weisen. Was ich wirklich brauchen, ist wie ein Wörterbuch / Hash, die für die 1-Taste ermöglicht es, und viele Werte. Wie so:

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

Ich betrachtete mit THashedStringList in der IniFiles Einheit, aber es leidet immer noch dass aus dem gleichen Problem erlaubt es nur 1 Schlüssel mit einem Wert zugeordnet werden.

War es hilfreich?

Lösung

Eine Möglichkeit wäre, eine TStringList zu schaffen, und haben jeden Objektpunkt Stück zu einem anderen TList (oder TStringList), die alle Ihre Werte enthalten würde. Wenn die oberste String-Liste sortiert ist, dann Abruf ist nur eine binäre Suche entfernt.

Um die Elemente Ihrer obersten Liste hinzuzufügen, verwenden Sie so etwas wie die folgenden (slist = TStringList):

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

Wenn seine Zeit, um die Liste zu verfügen, stellen Sie sicher, dass Sie frei jede der inneren Listen auch.

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);

Andere Tipps

Ich bin kein Programmierer Delphi konnte aber nicht einfach eine Liste oder ein Array als Wert für jeden Hash-Eintrag verwenden? In Java-Terminologie:

Map<String,List>

Sie scheinen bereits Jedi werden. Jedi enthält Klassen, die nichts mit irgendetwas kartieren lassen.

Werfen Sie einen Blick auf diese damit verbundene Frage .

Ich habe eine Reihe von irgendwelchen beliebig komplexen Benutzern definierten Datensatztypen als Cache in Verbindung mit einem oder TStringList THashedStringList im Einsatz. Ich greife auf jeden Datensatz einen Schlüssel. Zuerst prüfe ich die String-Liste für ein Spiel. Wenn keine Übereinstimmung gibt, dann bekomme ich den Datensatz aus der Datenbank und legen Sie sie in der Anordnung. Ich habe seinen Array-Index in die String-Liste. Mit den Aufzeichnungen arbeite ich mit, das ist, was mein Code wie folgt aussieht:

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;

Ich habe auf diese Weise scheinbar sofortigen Zugriff worden zu bekommen.

Jack

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top