Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2016, 21:52   #1
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию Сортирование в Мемо по длине строки

Здравствуйте. подскажите пожалуйста как отсортировать текс в Мемо по длине строки ?
пробовал таким способом
Код:
procedure TForm1.SortMemo2;
var I,j: integer;
tmp: string;
begin
for j:=0 to memo6.Lines.Count-1 do
for i:=0 to memo6.Lines.Count-2 do
 begin
  if length(memo6.Lines[i])>length(memo6.Lines[i+1]) then
   begin
    tmp:=memo6.Lines[i];
    memo6.Lines[i]:=memo6.Lines[i+1];
    memo6.Lines[i+1]:=tmp;
   end;
 end;
end;
но он работает ужасно долго
denis76560 вне форума Ответить с цитированием
Старый 27.01.2016, 22:27   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

используй для сортировки TStringList и его метод CustomSort
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.01.2016, 23:07   #3
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

прогуглил этот метод, но по длине строки для этого компонента, увы, не нашел. =(
denis76560 вне форума Ответить с цитированием
Старый 27.01.2016, 23:11   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А чего без гугла ни как? Длины строк сравнивай в Compare-функции
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.01.2016, 23:13   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

попробуйте такой код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
 
  function StringListCompareByLength(List: TStringList; Index1, Index2: Integer): Integer;
  var t1, t2 : integer;
  begin
      t1 := Length(List.Strings[Index1]);
      t2 := Length(List.Strings[Index2]);
      if t1=t2 then Result := 0
      else
        if t1<t2 then Result := 1
        else Result := -1
  end;
var TS : TStringList;
begin
  try
    TS := TStringList.Create;
    TS.Text := Memo1.Lines.Text;
    TS.CustomSort( @StringListCompareByLength );
    Memo1.Lines.Text := TS.Text;
  finally
    FreeAndNil(TS);
  end;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.01.2016, 00:36   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от denis76560 Посмотреть сообщение
Здравствуйте. подскажите пожалуйста как отсортировать текс в Мемо по длине строки ?
пробовал таким способом
Код:
procedure TForm1.SortMemo2;
var I,j: integer;
tmp: string;
begin
for j:=0 to memo6.Lines.Count-1 do
for i:=0 to memo6.Lines.Count-2 do
 begin
  if length(memo6.Lines[i])>length(memo6.Lines[i+1]) then
   begin
    tmp:=memo6.Lines[i];
    memo6.Lines[i]:=memo6.Lines[i+1];
    memo6.Lines[i+1]:=tmp;
   end;
 end;
end;
но он работает ужасно долго
Можно добавить сразу после первого begin строчку
Код:
memo6.Lines.BeginUpdate;
А после циклов строчку м
Код:
memo6.Lines.EndUpdate;
Скорость сразу возрастет до сравнимой со скоростью сортировки в TStringList.

Последний раз редактировалось northener; 28.01.2016 в 00:42.
northener вне форума Ответить с цитированием
Старый 28.01.2016, 09:27   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Скорость сразу возрастет до сравнимой со скоростью сортировки в TStringList
Ни чего подобного. Она возрастет сравнительно с вариантом из #1. Но с вариантом из #5 её скорость все равно будет на порядок хуже
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.01.2016, 10:19   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
maxl:=0;
for j:=0 to m.lines.count-1 do begin
  if length(m.lines.strings[j])>maxl then maxl:=length(m.lines.strings[j]);
end;

i:=0;
for k:=to maxl downto 1 begin
  for j:=i to m.lines.count-1 do begin
    if (length(m.lines.strings[j])=l) and (i<>j) then begin
      m.lines.exchange(i,j);
      i:=i+1;
    end;
  end;
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 29.01.2016, 16:47   #9
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
maxl:=0;
for j:=0 to m.lines.count-1 do begin
  if length(m.lines.strings[j])>maxl then maxl:=length(m.lines.strings[j]);
end;

i:=0;
for k:=to maxl downto 1 begin
  for j:=i to m.lines.count-1 do begin
    if (length(m.lines.strings[j])=l) and (i<>j) then begin
      m.lines.exchange(i,j);
      i:=i+1;
    end;
  end;
end;
увы,ваш код не заработал
с поправками
memo6.Lines.BeginUpdate;
А после циклов строчку
memo6.Lines.EndUpdate;
работает также долго

Последний раз редактировалось denis76560; 29.01.2016 в 16:51.
denis76560 вне форума Ответить с цитированием
Старый 29.01.2016, 17:13   #10
denis76560
Форумчанин
 
Регистрация: 13.01.2010
Сообщений: 121
По умолчанию

с задачей хорошо справился код от Serge_Bliznykov
denis76560 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MS Access. Сортировка по длине строки grominfo БД в Delphi 4 17.12.2012 00:23
вывод каждой второй строки из мемо ВалекFCRK Общие вопросы Delphi 2 15.06.2012 20:49
Сортировка файла по длине строки Existence Помощь студентам 3 29.09.2010 23:37
Строки в Мемо anymol Помощь студентам 5 03.10.2008 20:44
Строки в Мемо BETONOMESHALKA Общие вопросы Delphi 6 17.11.2007 02:01