Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.09;
Скачать: CL | DM;

Вниз

Сортировка нескольких TStringList   Найти похожие ветки 

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

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

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

b         k
a         l
d         m
c         n

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

список 1

a
b
c
d

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

список 2

l
k
n
m


 
Сергей М. ©   (2008-10-01 12:21) [1]

при (т.е. в ходе выполнения) сортировке одного из них или после оной ?

Разные же вещи.. и реализации, соответственно, могут быть разные ..


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


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


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


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


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


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


 
Johnmen ©   (2008-10-01 12:31) [4]


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

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


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


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


Да


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

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


 
DVM ©   (2008-10-01 12:36) [7]


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

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


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

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


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


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


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

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


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

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


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

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


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


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

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


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


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

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


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

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;


 
DVM ©   (2008-10-01 13:08) [15]


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

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


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

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

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;


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


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


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

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


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


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


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


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


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


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

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

abcd
abcd
abcdf
abcd
abcdf
abcdf
abcdf
abcdfg
abcdfg


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

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


 
Leonid Troyanovsky ©   (2008-10-01 14:12) [20]


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

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

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

--
Regards, LVT.


 
MsGuns ©   (2008-10-01 16:57) [21]

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



Страницы: 1 вся ветка

Текущий архив: 2008.11.09;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.013 c
2-1222762898
neon-w
2008-09-30 12:21
2008.11.09
NAN????


15-1221257388
Tirael
2008-09-13 02:09
2008.11.09
вирус


8-1187600870
leonidus
2007-08-20 13:07
2008.11.09
приложение с GDI+ не запустилось на Win2000, что делать?


2-1222707635
@!!ex
2008-09-29 21:00
2008.11.09
Менеджмент мониторов


2-1222885420
Потокер
2008-10-01 22:23
2008.11.09
вызов метода в Thread