字典+列表

时间:2018-02-07 09:45:48

标签: delphi generics

我正在尝试优化一段包含对象(指针)之间关系的代码。

情况如下:

从一系列对象中生成一系列图纸:

  

TElement(A)--->生成零,一个或多个TDrawing(B)

(类不相关,所以我称之为A和B)

当前的实现是使用字典

  

TDictionary< B,A>

因此B类中的每个对象都来自一个独特的A

但是为了识别属于类A的给定对象的B类的所有对象,这是非常低效的,因为字典需要循环以找到具有特定值的所有键。

直接的解决方案是将数据结构更改为以下内容:

  

TDictonary< TELEments,TList< TDrawing> >

这不是完全有效的,因为在填写字典和列表时需要进行大量的小内存分配。

我想知道是否有人能给我一个好的实施提示,我将不胜感激!

(对不起我的英文)

1 个答案:

答案 0 :(得分:-1)

一个非常难看的代码,但我已经提出了这个解决方案:

PLinks:TDictionary<TElement, TObject>;

其中值是单个对象或列表。添加值时,如果先前未设置该键,则将其设置为该对象。只有在尝试为键添加第二个值时,该值才会转换为列表。

procedure AddLink(const source:TElement; object:TDrawing);
var
  v:TObject;
  list:TList<TDrawing>;
begin
 if not PLinks.ContainsKey(source) then
    PLinks.Add(source, object)
 else begin
    v:=PLinks[source];
    if v is TList<TDrawing> then
      (valor as TList<TDrawing>).add(n)
    else begin // v is TDrawing
      list:=TList<TDrawing>.Create;
      list.Add(v as TDrawing); // adds previous unique item
      list.Add(object);
      PLinks[source]:=list;
    end;
  end;
end;

显然,当循环遍历值时,必须检查该值是单个对象还是列表。

它不是很优雅,主要是因为编译时类型检查丢失了,但就速度和内存节省来说还不错。