Форум: "Начинающим";
Текущий архив: 2008.11.09;
Скачать: [xml.tar.bz2];
ВнизСортировка нескольких 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c