【问题标题】:Delphi - how to implement sorted table of integers and strings, sorted by integer?Delphi - 如何实现整数和字符串的排序表,按整数排序?
【发布时间】:2016-10-22 22:23:20
【问题描述】:

我想创建一个表,每行包含一个整数和一个字符串。该表应按整数排序。最终目标是提取具有最小关联整数的“n”个字符串。

TStringlist 不太正确,因为它只是一个字符串。它们有名称-值对,但它们的排序顺序错误——我想要值-名称,按值排序。 TDictionary 未排序且无法排序(除了按哈希排序)

我想我可以将整数格式化为一个足够长的字符串,以容纳带前导零的最大整数,并将其连接到 TStringList 中其余字符串数据的开头,但这看起来很难看。有没有更优雅的方法来实现这个表,按整数部分排序?

【问题讨论】:

  • 您可以切换到使用记录类型,并使用这些记录的 TList 并使用自定义比较器进行排序。或者使用 TStringList,将整数存储在对象中,并使用自定义排序按这些整数而不是字符串排序。 (在 TStringList.Objects 中存储整数的示例是 here;参见第二个代码 sn-p。)
  • 不要害怕定义类型。仅仅因为您拥有 RAD 工具,您就不必拘泥于库中的类型。
  • @KenWhite TList 适用于很少更改的数据。也许他最好坚持使用双链表。取决于工作模式

标签: string sorting delphi


【解决方案1】:

字符串列表仍然有效,只需将整数转换为对象字段。

function SortStringListByObject(List: TStringList; Index1, Index2: Integer): Integer;
begin
  if Integer(List.Objects[Index1]) = Integer(List.Objects[Index2])
  then result := 0
  else
    if Integer(List.Objects[Index1]) < Integer(List.Objects[Index2])
    then result := -1
    else result := 1;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
  sl: TStringList;
  x: Integer;
begin
  StartTime := Now;
  sl := TStringList.Create;
  try
    // add some objects (and strings)
    sl.AddObject('One',TObject(3));
    sl.AddObject('Two',TObject(2));
    sl.AddObject('Three',TObject(1));

    // sory by my function
    sl.CustomSort(SortStringListByObject);

    // show results
    for x := 0 to sl.count-1 do begin
      Memo1.lines.Add(sl[x]);
    end;
  finally
    sl.Free;
  end;
end;

【讨论】:

  • 请注意,这只适用于桌面编译器。移动编译器不允许在对象之间转换整数。
猜你喜欢
  • 2019-01-13
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 2022-01-24
  • 1970-01-01
相关资源
最近更新 更多