Delphi - обратная сортировка строк в TStringList после сортировки по возрастанию
При работе с TStringList в Delphi часто возникает необходимость отсортировать строки в списке. Однако, по умолчанию сортировка происходит по возрастанию. В этом материале мы рассмотрим, как выполнить обратную сортировку строк в TStringList после сортировки по возрастанию.
Проблема
Разработчик столкнулся с трудностью при сортировке строк в TStringGrid. Он смог отсортировать строки по возрастанию, но не knows, как отсортировать их в обратном порядке. Он пытался использовать тот же код для другой сортировки, изменив последний цикл, чтобы прочитать TStringList с конца, но это не сработало и привело к тому, что одна строка из списка дублировалась во всех остальных строках. Есть ли способ обратиться к TStringList в обратном порядке после сортировки?
Код, который разработчик использовал для другой сортировки и пытался применить для этой сортировки (изменив только последний цикл):
procedure TfrmPuntehou.SortLTSGrid(var grid: TStringGrid; columntotal: Integer);
const
separator = ',';
var
iCount, i, j, k, iPos: Integer;
TheList: TStringList;
sString, sTempString: string;
m, o: Integer;
begin
//процедура для сортировки от больших к маленьким значениям
//получить количество строк
iCount := grid.RowCount - 1;
//создать список
TheList := TStringList.Create;
TheList.Sorted := False;
//начало блока try..finally
try
begin
//заполнить список
for i := 1 to (iCount - 1) do
begin
TheList.Add(grid.Rows[i].Strings[columntotal] + separator + grid.Rows[i].Text);
end;
//отсортировать список
TheList.Sort;
for k := 1 to TheList.Count do
begin
//получить строку из списка и поместить ее в переменную строки
sString := TheList.Strings[(k - 1)];
//найти позицию разделителя в этой строке
iPos := AnsiPos(separator, sString);
sTempString := '';
//удалить разделитель и текст столбца в начале строки
sTempString := Copy(sString, (iPos + 1), Length(sString));
TheList.Strings[(k - 1)] := '';
TheList.Strings[(k - 1)] := sTempString;
end;
//заполнить таблицу
for j := (iCount - 1) downto 1 do
begin
for o := 1 to (iCount - 1) do
begin
grid.Rows[j].Text := TheList.Strings[(o - 1)];
end;
end;
//заполнить номера строк
for m := 1 to iCount do
begin
grid.Cells[0, m] := IntToStr(m);
end;
end;
finally
TheList.Free;
end;
//конец блока try..finally
end;
Решение
Чтобы отсортировать TStringList в обратном порядке после сортировки по возрастанию, можно использовать процедуру CustomSort. Для этого нужно создать метод сравнения, который будет использоваться для сортировки. Метод сравнения определяет, как сравнивать две строки для определения их порядка в отсортированном списке.
Вот пример двух методов сравнения:
function Compare1( // нормальная алфавитно-цифровая сортировка
List: TStringList;
Index1: Integer;
Index2: Integer): Integer;
begin
if List[Index1] = List[Index2] then
Result := 0
else if List[Index1] < List[Index2] then
Result := -1
else
Result := 1;
end;
function Compare2( // обратная алфавитно-цифровая сортировка
List: TStringList;
Index1: Integer;
Index2: Integer): Integer;
begin
if List[Index1] = List[Index2] then
Result := 0
else if List[Index1] < List[Index2] then
Result := 1
else
Result := -1;
end;
Теперь, чтобы использовать эти методы сравнения для сортировки TStringList, можно воспользоваться следующим примером кода:
procedure TForm1.Button1Click(Sender: TObject);
var
SList: TStringList;
S: String;
begin
SList := TStringList.Create;
try
SList.Add('Pierre');
SList.Add('Albert');
SList.Add('Paul');
SList.Add('Jean');
SList.Add('Simon');
Memo1.Lines.Add('=== Compare1 ===');
SList.CustomSort(Compare1);
for S in SList do
Memo1.Lines.Add(S);
Memo1.Lines.Add('=== Compare2 ===');
SList.CustomSort(Compare2);
for S in SList do
Memo1.Lines.Add(S);
finally
SList.Free;
end;
end;
В этом примере создается список строк и добавляются пять имен. Затем выполняется сортировка списка с помощью двух методов сравнения: Compare1 (нормальная алфавитно-цифровая сортировка) и Compare2 (обратная алфавитно-цифровая сортировка). Результаты сортировки выводятся в Memo1.
Вывод
В этом материале мы рассмотрели, как выполнить обратную сортировку строк в TStringList после сортировки по возрастанию в Delphi. Используя процедуру CustomSort и методы сравнения, можно легко отсортировать список строк в обратном порядке после сортировки по возрастанию.
В материале рассматривается решение задачи обратной сортировки строк в TStringList после сортировки по возрастанию в Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS