Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сортировка нескольких TStringList [D7, XP]


Страницы:   1 2

Игорь ©   (2008-10-01 12:17:00) 

Есть несколько TStringList, как сделать что бы при сортировке одного из них элементы остальных переместились согласно списка который сортировали, например есть два списка

список 1  список 2

b         k
a         l
d         m
c         n

после сортировки список 1 будет выглядеть так

список 1

a
b
c
d

нужно что бы элементы списка 2 переместились в итоге вот так

список 2

l
k
n
m


MsGuns   (2008-10-01 16:57:00) [1]

Если информация об одних и тех же "объектах" отображается в нескольких контролах и при этом порядок следования их должен быть везде одинаков, то, ИМХО, стОит эти объекты сначала сохранить в список, а этот список "подавать" всем процедурам отрисовки. При изменении порядка или состава объектов, выполнять перерисовку всех контролов. Тогда полная и "желеная" синхронизация будет обеспечена


Leonid Troyanovsky   (2008-10-01 14:12:00) [2]


> Игорь ©   (01.10.08 13:52) [16]

> Я сейчас делаю так

Взять 2 стринглиста, и один TList, который будет хранить индексы строк, сортировать TList путем Sort с нужной TListSortCompare.
А для доступа к элементам второго списка использовать
отсортированный TList.

--
Regards, LVT.


Игорь   (2008-10-01 14:11:00) [3]


> Правильный$Вася   (01.10.08 13:59) [17]


В том то и дело что в List1

например иногда получается так

abcd
abcd
abcdf
abcd
abcdf
abcdf
abcdf
abcdfg
abcdfg


хотя наверно процедура работает правильно и все дело в другом, наверняка что то у меня в конечном выводе результатов в ListView не так, вобщем буду разбираться.

СПАСИБО ПАРНИ


Сергей М.   (2008-10-01 14:02:00) [4]


> сейчас делаю так


А чем тебя не устроила встроенная в TStringList возможность сортировки ?


Правильный$Вася   (2008-10-01 13:59:00) [5]


>  если попадаются одинаковые записи в списке то сортируется
> неправильно

в первом неправильно или во втором?
в первом они одинаковые - следовательно полядок произвольный
а во втором ты собственного порядка не предлагал


Игорь   (2008-10-01 13:52:00) [6]

Я сейчас делаю так

var
 i, k, l, m: integer;
begin
 m:= 0;
 for i:= 0 to List1.Count - 1 do
 begin
   l:= 0;
   for k:= 0 to List1.Count - 1 do
   begin
     if AnsiCompareStr((List1.Strings[m]), (List1.Strings[List1.Count - 1 - k])) = 1 then
     begin
       List1.Move(m, List1.Count - 1 - k);
       List2.Move(m, List1.Count - 1 - k);
       List3.Move(m, List1.Count - 1 - k);
     end;
   end;
   if l = 0 then
     Inc(m)
 end;


но почему то иногда если попадаются одинаковые записи в списке то сортируется неправильно


DVM   (2008-10-01 13:08:00) [7]


> Правильный$Вася   (01.10.08 13:01) [13]
>
>
> > DVM ©   (01.10.08 12:59) [12]
>
> логично
> но к фразе
> > в любом случае используешь
> не клеется

я подумал автор сам сортирует элементы, а не пользуется встроенными механизмами


Сергей М.   (2008-10-01 13:04:00) [8]

TStringListEx = class(TStringList)
protected
 FOriginalProc: TStringListSortCompare;
public
  procedure CustomSort(Compare: TStringListSortCompare); override;
end;
..

function CompareStrings(List: TStringList; Index1, Index2: Integer): Integer;
begin
 Result := TStringListEx(List).FOriginalProc(List, Index1, Index2);
 if (Index1 < Index2) and (Result > 0) then
   SomeAssotiatedStringList.Exchange(Index1, Index2);
end;

procedure TStringListEx.CustomSort(Compare: TStringListSortCompare); override;
begin
FOriginalProc := @Compare;
inherited CustomSort(@CompareStrings) ;
end;


Правильный$Вася   (2008-10-01 13:01:00) [9]


> DVM ©   (01.10.08 12:59) [12]

логично
но к фразе
> в любом случаеиспользуешь
не клеется


DVM   (2008-10-01 12:59:00) [10]


> sorted:=true никаких ноеров не предоставляет

ну так не использовать его


Сергей М.   (2008-10-01 12:43:00) [11]

Придется задействовать CustomSort.


Сергей М.   (2008-10-01 12:41:00) [12]

О, пардон.. Неверно это.


Правильный$Вася   (2008-10-01 12:39:00) [13]


> При сортировке первого списка ты в любом случае используешь
> номера переставляемых в списке элементов

sorted:=true никаких ноеров не предоставляет


Сергей М.   (2008-10-01 12:37:00) [14]

Тогда простейшее решение м.б., к примеру, вот таким:


TStringListEx = class(TStringList)
protected
   procedure Exchange(Index1, Index2: Integer); override;
end;
..
procedure TStringListEx.Exchange(Index1, Index2: Integer);
begin
 inherited;
 MirrorStringList.Exchange(Index1, Index2);
end;


DVM   (2008-10-01 12:36:00) [15]


> Игорь ©   (01.10.08 12:17)

При сортировке первого списка ты в любом случае используешь номера переставляемых в списке элементов. Используй эти же номера для перестановки элементов второго списка.


Правильный$Вася   (2008-10-01 12:33:00) [16]

можно в поле Data первого списка хранить адреса элементов второго списка
второй список не сортируется, но соответствие элементов сохраняется


Игорь   (2008-10-01 12:32:00) [17]


> Сергей М. ©   (01.10.08 12:31) [3]


Да


Johnmen   (2008-10-01 12:31:00) [18]


> Игорь ©   (01.10.08 12:17) 

Тебе надо определиться, каким образом ты реализуешь взаимно однозначное соответствие элементов. Или, как минимум, односторонне однозначное.


Сергей М.   (2008-10-01 12:31:00) [19]


> Игорь ©   (01.10.08 12:28) [2]


Допускается ли использование наследников TStringList для решения задачи ?


Игорь   (2008-10-01 12:28:00) [20]


> Сергей М. ©   (01.10.08 12:21) [1]


Что бы в ходе выполнения


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо