Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.5 MB
Время: 0.004 c
2-1222842413
abhtr
2008-10-01 10:26
2008.11.09
Как задать "масштаб" формы, учитывающий разрешение экрана?


2-1222932887
JohnKorsh
2008-10-02 11:34
2008.11.09
Вопрос по компоненту IdlCmpClient


2-1222865303
White
2008-10-01 16:48
2008.11.09
Создание копии базы данных


15-1221297971
@!!ex
2008-09-13 13:26
2008.11.09
День программиста - Набор стереотипов


2-1222885028
MZG
2008-10-01 22:17
2008.11.09
Получить свойства полей таблицы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский