Как мне перечислить JvMemoryData ... Или, как мне создать хеш с одним ключом и несколькими значениями? - PullRequest
0 голосов
/ 03 марта 2009

Я использую JvMemoryData для заполнения JvDBUltimGrid. В первую очередь я использую эту JvMemoryData в качестве структуры данных, потому что я не знаю ничего другого, соответствующего моим потребностям.

Я не работаю с большим количеством данных, но мне нужен способ перечислять записи, которые я добавляю в JvMemoryData. Кто-нибудь делал это раньше? Можно ли как-то «запросить» эти данные с помощью TSQLQuery?

Или есть лучший способ сделать это? Я немного наивен, когда дело доходит до структур данных, поэтому, возможно, кто-то может указать мне правильное направление. Что мне действительно нужно, так это словарь / хэш, который учитывает 1 ключ и много значений. Вот так:

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

Я рассмотрел возможность использования THashedStringList в модуле IniFiles, но он все еще страдает от той же проблемы, поскольку позволяет связать только 1 ключ со значением.

Ответы [ 4 ]

2 голосов
/ 04 марта 2009

Один из способов - создать 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 голос
/ 03 марта 2009

Кажется, вы уже используете джедая. Джедай содержит классы, которые позволяют вам сопоставить что угодно с чем угодно.

Взгляните на этот связанный вопрос .

1 голос
/ 03 марта 2009

Я не программист на Delphi, но не могли бы вы просто использовать список или массив в качестве значения для каждой хеш-записи? В терминологии Java:

Map<String,List>
0 голосов
/ 03 марта 2009

Я использовал массив любых произвольно сложных пользовательских типов записей в качестве кэша в сочетании с 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;

Я получил мгновенный доступ таким образом.

Jack

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...