Как отсортировать TStringList по его значениям в Delphi 7 - PullRequest
2 голосов
/ 13 февраля 2020

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

SL: TStringList;
SL:= TStringList.Create; 


SL.Values['chelsea']:= '5';
SL.Values['Liverpool']:= '15';
SL.Values['Mancity']:= '10';
SL.Values['Tot']:= '0';
SL.Values['Manunited']:= '20';

Наконец это TStringList должно быть отсортировано в соответствии со значениями. на самом деле имя должно быть именем с наибольшим значением.

1 Ответ

4 голосов
/ 13 февраля 2020

Вы можете сделать это, используя метод CustomSort. Вот так:

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes;

function StringListSortProc(List: TStringList; Index1, Index2: Integer): Integer;
var
  i1, i2: Integer;
begin
  i1 := StrToInt(List.ValueFromIndex[Index1]);
  i2 := StrToInt(List.ValueFromIndex[Index2]);
  Result := i2 - i1;
end;

var
  SL: TStringList;
  Index: Integer;
begin
  SL := TStringList.Create;
  try
    SL.Values['Chelsea'] := '5';
    SL.Values['Liverpool'] := '15';
    SL.Values['Man City'] := '10';
    SL.Values['Spurs'] := '0';
    SL.Values['Man United'] := '20';

    WriteLn('Before sort');
    for Index := 0 to SL.Count-1 do
      WriteLn('  ' + SL[Index]);
    SL.CustomSort(StringListSortProc);

    WriteLn;
    WriteLn('After sort');
    for Index := 0 to SL.Count-1 do
      WriteLn('  ' + SL[Index]);
  finally
    SL.Free;
  end;
  ReadLn;
end.

Я не помню, когда был добавлен метод ValueFromIndex. Если его нет в Delphi 7, вы можете эмулировать его следующим образом:

function ValueFromIndex(List: TStringList; Index: Integer): string;
var
  Item: string;
begin
  Item := List[Index];
  Result := Copy(Item, Pos('=', Item) + 1, MaxInt);
end;

function StringListSortProc(List: TStringList; Index1, Index2: Integer): Integer;
var
  i1, i2: Integer;
begin
  i1 := StrToInt(ValueFromIndex(List, Index1));
  i2 := StrToInt(ValueFromIndex(List, Index2));
  Result := i2 - i1;
end;

Вывод программы:

Before sort
  Chelsea=5
  Liverpool=15
  Man City=10
  Spurs=0
  Man United=20

After sort
  Man United=20
  Liverpool=15
  Man City=10
  Chelsea=5
  Spurs=0
...