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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2013, 09:57   #1
chui
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 48
По умолчанию Сортировка в StringList

Здраствуйте. Нужно сделать сортировку в StringList, но Stringlist.Sorted:= true не подходит, т.к. необходимо сортировать, к примеру, только по символам с 3 по 6 каждого итема стринглиста. Как это сделать?
chui вне форума Ответить с цитированием
Старый 03.04.2013, 10:03   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А как бы делали сортировку массива символьных строк? Так же и стринглист, в качестве массива Strings
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.04.2013, 20:18   #3
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Или через CustomSort http://programmersforum.ru/showpost....35&postcount=3
eoln вне форума Ответить с цитированием
Старый 04.04.2013, 10:53   #4
chui
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 48
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Не совсем понял, как это использовать именно для данной задачи.



Пришла в голову другая идея. Переносим первые символы в конец строки, потом сортируем обычным sorted:= true, потом возвращаем символы на место. Сильно криво это будет?
chui вне форума Ответить с цитированием
Старый 04.04.2013, 11:05   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сильно криво это будет?
Сильно. Там делов то:
Код:
  for i:=0 to List.Count-2 do
    for j:=i+1 to List.Count-1 do
      if AnsiCompareText(Copy(List.Strings[j],3,4),Copy(List.Strings[i],3,4))<0 then begin
        s:=List.Strings[i];
        List.Strings[i]:=List.Strings[j];
        List.Strings[j]:=s;
      end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.04.2013, 11:23   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Аватар, у TStringList есть метод Exchange, меняющий два элемента местами;

Цитата:
Swaps the position of two strings in the list.

procedure Exchange(Index1, Index2: Integer);
поэтому:
Код:
  for i:=0 to List.Count-2 do
    for j:=i+1 to List.Count-1 do
        if AnsiCompareText(Copy(List.Strings[j],3,4),Copy(List.Strings[i],3,4))<0 then List.Exchange(i,j);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.04.2013, 11:30   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
у TStringList есть метод Exchange, меняющий два элемента местами
Тем более, делов еще меньше стало
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.04.2013, 12:48   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Не совсем понял, как это использовать именно для данной задачи.
написать и подключить СВОЮ функция сравнения
Цитата:
Код:
a.CustomSort(@StringListCompareLengtnStrings);//пользовательская сортировка
после этого sorted:=true будет сортировать в соответствии с указанным правилом.

писать надо как-то так
Код:
      if strings[index1]<strings[index2] then result:=1
else if strings[index1]>strings[index2] then result:=-1
else if strings[index1]=strings[index2] then result:=0
else raise ;
с допиливанием до этого
Цитата:
т.к. необходимо сортировать, к примеру, только по символам с 3 по 6 каждого итема стринглиста.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.04.2013 в 12:51.
evg_m вне форума Ответить с цитированием
Старый 04.04.2013, 20:28   #9
chui
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 48
По умолчанию

Спасибо всем огромное. Сделал так:
Код:
  for i:=0 to List.Count-2 do
    for j:=i+1 to List.Count-1 do
        if AnsiCompareText(Copy(List.Strings[j],3,4),Copy(List.Strings[i],3,4))<0 then List.Exchange(i,j);
chui вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись в stringlist stasa9711 Общие вопросы Delphi 1 23.03.2013 14:41
Поиск и удаление строк в StringList из другово stringlist SmoK777 Общие вопросы Delphi 3 06.08.2012 08:21
Stringlist record222 Общие вопросы Delphi 1 26.06.2012 17:35
StringList adr Общие вопросы Delphi 0 05.11.2010 18:43
stringlist grater83 Общие вопросы Delphi 2 21.09.2009 14:26