[英]How Can I Replace StringList.Sort with a Stable Sort in Delphi?
我正在做一個簡單的StringList.sort,但是Delphi使用的QuickSort不是一個穩定的排序,這意味着它可能會改變具有相同鍵的記錄的相對順序。
我需要使用穩定的排序。 對我來說,實現這個最簡單的方法是什么?
Mike W的答案可能是最簡單的方法,無需進行太多的代碼更改。
謝謝,邁克。
如果您尚未使用字符串列表的Objects屬性,則快速而骯臟的解決方案是將對象屬性中的原始位置存儲為整數。 然后,您可以提供自己的穩定排序比較功能,該功能將原始位置考慮在內。 您在自己的代碼中所要做的就是在調用CustomSort之前迭代整個列表分配objects屬性:
function StableSortCompare(List: TStringList; Index1, Index2: Integer): Integer;
begin
result := CompareStr(List[Index1], List[Index2]);
if result = 0 then result := integer(List.Objects[Index1]) - integer(List.Objects[Index2]);
end;
procedure TSortTestForm.SortButtonClick(Sender: TObject);
var
SL : TStringList;
i : integer;
begin
SL := TStringList.Create;
try
SL.AddObject('One', pointer(0));
SL.AddObject('One', pointer(1));
SL.AddObject('One', pointer(2));
SL.AddObject('Two', pointer(3));
SL.AddObject('Two', pointer(4));
SL.AddObject('One', pointer(5));
SL.AddObject('One', pointer(6));
SL.AddObject('One', pointer(7));
// SL.Sort; // Try instead of custom sort to see difference
SL.CustomSort(StableSortCompare);
for i := 0 to SL.Count-1 do begin
Memo1.Lines.Add(Format('Text: %s Orig Pos: %d', [SL[i], integer(SL.Objects[i])]));
end;
finally
SL.Free;
end;
end;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.