![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сортировка нескольких TStringList [D7, XP]
Игорь © (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]
Что бы в ходе выполнения