【问题标题】:Delphi: Store multiple Sortings of TObjectListDelphi:存储TObjectList的多个排序
【发布时间】:2017-12-24 11:09:38
【问题描述】:

我有一堆存储在 TObjectList 中的 TCoordinate。为了更快地找到坐标,必须对列表进行排序。问题是我在交替搜索 x 和 y。是否有一种内置方式来存储排序结果,所以我不需要一次又一次地对列表进行排序。

unit uStackoverflowQuestion;

interface

uses
  System.Generics.Collections, System.Generics.defaults;

type
  TCoordinate = class(Tobject)
    public
      x: Integer;
      y: Integer;
  end;

  TMultipleSortedList = class(TObjectlist<TCoordinate>)
    public
      // StoredSortingByX: List;
      // StoredSortingByY: List;
      procedure SortAndStoreByX;
      procedure SortAndStoreByY;
  end;

implementation

procedure TMultipleSortedList.SortAndStoreByX;
begin
  // TODO -cMM: TMultipleSortedList.SortAndStoreByX default body inserted
end;

procedure TMultipleSortedList.SortAndStoreByY;
begin
  // TODO -cMM: TMultipleSortedList.SortAndStoreByY default body inserted
end;

end.

【问题讨论】:

  • 要更快地找到坐标,您可以考虑dictionary。或者 R-Tree 如果您要使用地理坐标。

标签: sorting delphi store tobjectlist


【解决方案1】:

创建一个索引图来表示两个不同的订单。这只是一个动态整数数组。

type
  TListOrder = TArray<Integer>;

当您希望使用该顺序阅读项目时,您可以这样做:

function GetItem(Index: Integer; const Order: TListOrder): TItem;
begin
  Result := List[Order[Index]];
end;

这里的重点是我们永远不会修改List 的内容。我们认为这是无序的。相反,我们将订单与容器分开。这允许我们有多个这样的订单。

下一个问题是如何创建订单。首先使用所有有效索引填充订单:

var
  i: Integer;
  Order: TListOrder;
....
SetLength(Order, List.Count);
for i := 0 to List.Count-1 do
  Order[i] := i;

现在您可以像这样对订单进行排序:

TArray.Sort<Integer>(Order, Comparer);

最后,使用什么作为比较器。这就是魔法发生的地方。

var
  Comparer: IComparer<Integer>;
....
Comparer := 
  function(const Left, Right: Integer): Integer
  var
    LeftItem, RightItem: TItem;
  begin
    LeftItem := GetItem(Left, Order);
    RightItem := GetItem(Right, Order);
    Result := ...; // your compare logic goes here
  end;

就是这样。

【讨论】:

    【解决方案2】:

    如果列表中的对象没有改变,您可以使用 TList 来存储对对象的附加引用,而不是 David Heffernan 建议的整数数组。它在访问时间上有一个小优势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      相关资源
      最近更新 更多