Сортировка строк по возрастанию

Есть строки в Memo1.Text такого вида:

способ - 8 повторов
протащить - 2 повторов
год - 14 повторов
принять - 3 повторов
и - 15 повторов

Как отсортировать строки по первым словам, по длине слова - от большего к меньшему, то есть чтобы на выходе получить результат:

протащить - 2 повторов
принять - 3 повторов
способ - 8 повторов
год - 14 повторов
и - 15 повторов

Ответы (1 шт):

Автор решения: MBo

У TStringList (увы, не у TStrings) есть метод CustomSort. В него передаётся функция сравнения.

А внутри этой функции нужно выделить первые слова строк и сравнить их длину. В идеальном случае достаточно будет просто найти Pos пробела:

function SortCompare(AList: TStringList; Index1, Index2: integer): integer;
begin
  Result := Pos(' ', AList[Index2]) - Pos(' ', AList[Index1]);
end;

procedure TForm1.Button43Click(Sender: TObject);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    sl.Assign(Memo1.Lines);
    sl.CustomSort(SortCompare);
    Memo1.Lines.Assign(sl);
  finally
    sl.Free;
  end;
end;
→ Ссылка