Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];

Вниз

Сортировка чисел по возрастанию.   Найти похожие ветки 

 
R   (2003-05-12 01:37) [0]

TString.List умеет сортировать строки, а есть ли аналог
который может сортировать числа или самому надо писать функцию.


 
MBo   (2003-05-12 06:18) [1]

метод CustomSort


 
R   (2003-05-12 07:52) [2]

Люди добрые приведите пример использования
CustomSort в TString.List что то я в нем окочательно запутался.


 
Song   (2003-05-12 08:54) [3]

А загрузить в TStrings и включить Sorted:=True ?


 
Anatoly Podgoretsky   (2003-05-12 08:58) [4]

StringList(MySort);


 
R   (2003-05-12 09:22) [5]

>Song © тест сортировки с помощью Sorted:=True :
До33
2
3
0
2222
11
1
После0
1
11
2
2222
3
33
А надо0
1
2
3
11
33
2222


>Anatoly Podgoretsky © я понимаю краткость сестра таланта,
но я непонимаю данный ответ StringList(MySort);


 
MBo   (2003-05-12 09:25) [6]

Напиши свою функцию, прототип описан в хелпе по CustomSort, и ее имя указывай при вызове
MyList.CustomSort(MySortFunc);
точно не помню, может, ее адрес нужно передавать (@ перед имененм)


 
Переяслов Григорий   (2003-05-12 09:40) [7]

А ведь по правилам сортировки то, что тебе надо работать не будет. Надо сортировку писать ручками.


 
R   (2003-05-12 09:40) [8]

Но в чем же тогда смысл CustomSort если приходится
програмировать свою функцию. Я ведь об этом в вопросе и
спрашивал ? или самому надо писать функцию.


 
Переяслов Григорий   (2003-05-12 09:42) [9]

Точнее, сортировать надо по критерию
StrToInt(StringList.Items.Strings[StringList.ItemIndex])


 
MBo   (2003-05-12 09:43) [10]

Да, или.
СustomSort просто обеспечивает возможность ее использования. Это общая практика.


 
Digitman   (2003-05-12 09:44) [11]

Sorts the strings in the list in a customized order.

type TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;
procedure CustomSort(Compare: TStringListSortCompare); virtual;

Description

Use CustomSort to sort the strings in the list, where the sort order is defined by the Compare parameter.

Supply a value for the Compare function that compares two strings in the string list. The List parameter provides access to the string list, while the Index1 and Index2 parameters identify the strings to be compared. Use Index1 and Index2 as indexes into the Strings property array. The Compare function should return

a value less than 0 if the string identified by Index1 comes before the string identified by Index2
0 if the two strings are equivalent
a value greater than 0 if the string with Index1 comes after the string identified by Index2.
Do not pass nil as the value of the Compare parameter.

Note: You must explicitly call the CustomSort method. Setting the Sorted property only sorts strings using ANSI order, as implemented in the Sort method.


 
DVM   (2003-05-12 09:50) [12]

А вы не замечали в XP функции сортировки с числами сами работают как надо?


 
Anatoly Podgoretsky   (2003-05-12 09:54) [13]

Anatoly Podgoretsky © (12.05.03 08:58)
немного ошибся, надо
StringList.CustomSort(MySort);

DVM © (12.05.03 09:50)
Не замечали, но они везде работают как надо. Ему же не числа надо сортировать а строки по своему закону, для этого надо использовать CustomSort


 
R   (2003-05-12 09:54) [14]

>Digitman © из этой справки видно что для чисел метод применить
не получится или я не прав.


 
R   (2003-05-12 10:10) [15]

>Anatoly Podgoretsky © сортировать мне надо числа просто
они помещены в стринг лист естественно как строки,
но мне подчеркну надо сортировать их по
"числовому порядку" -1 0 2 3 4 5 6.....


>DVM © у меня 98я но если в XP сортирует по другому то
это совсем уж никуда не годится.Это называется Б А Г


 
DVM   (2003-05-12 10:15) [16]


> R

Нет это не баг, а то, что Вам нужно. Она как раз сортирует числа записанные строкой так как Вам нужно. Там дополнительных усилий прилагать не надо: 1,3,16,10,5 >>> 1,3,5,10,16 а не как Win9x/2000 : 1,10,16,3,5. А в Win9x - CustomSort и делать свою функцию сортировки.


 
Palladin   (2003-05-12 10:21) [17]


> R (12.05.03 10:10)

не обращай на DVM ©, это локальный баг, чиста конкретно его...


function CompareIntegers(P1,P2:pointer):integer;
begin
result:=integer(p1)-integer(p2);
end;

procedure Form1.Button1Click(Sender:TObject);
var
MyIntegers:TList;
i:integer;

begin
MyIntegers:=TList.Create;
MyIntegers.Add(pointer(12));
MyIntegers.Add(pointer(1));
MyIntegers.Add(pointer(34));
for i:=0 to MyIntegers.Count-1 do
memo1.lines.add(intttostr(integer(MyIntegers[i])));
MyIntegers.Sort(@CompareIntegers);
for i:=0 to MyIntegers.Count-1 do
memo1.lines.add(intttostr(integer(MyIntegers[i])));
MyIntegers.Free;
end;


не тестировал... примерно так набросал


 
Digitman   (2003-05-12 10:23) [18]


> R


не прав

ты реализуешь некую ф-цию (с указанным прототипом), задача которой - сравнивать два целочисленных значения (>, <, =).

вызываешь CustomSort(@эта_самая_функция)

реализованный "внутри" метода CustomSort алгоритм быстрой сортировки будет вызывать эту ф-цию всякий раз, когда ему потребуется сравнить очередные два элемента списка (индексы двух сравниваемых элементов списка передаются в ф-цию параметрами), и до тех пор, пока список не будет окончательно упорядочен.

твоя задача - в теле этой ф-ции получить по указанным индексам в указанном списке строковые представления сравниваемых чисел, преобразовать их в числовое представление, сравнить полученные числа и вернуть результат сравнения в виде 1 ( Число 1 > Число 2), 0 (Число 1 = Число 2), -1 (Число 1 < Число 2)

все остальное метод CustomSort сделает самостоятельно, "прозрачно" для тебя

p.s.

многократные (повторяющиеся в ходе сортировки) преобразования строки в число значительно снижают производительность алгоритма сортировки, особенно - на больших списках.
поэтому есть смысл при заполнении списка для каждого нового i-го элемента сразу же преобразовывать его в ц/ч представление и хранить его в св-ве Objects[i].
тогда, получив в ф-цию сравнения индексы двух сравниваемых элементов, можно будет сравнивать уже заранее подготовленные числовые представления


 
Anatoly Podgoretsky   (2003-05-12 10:25) [19]

R (12.05.03 09:54)
Конечно неправл в StringList нет чисел, только строки!!!

R (12.05.03 10:10)
Так используй для этого CustomSort, он для этого и предназначен, слово Custom переводится как Пользовательская, а Sort сортировка.
Ты просил показать как пользоваться CustomSort, тебе показали, ну а как сравнивать два числовых значения, выраженных в строковом виде, это вообще задачка для первого курса института непрофилирующей спечиальности или для курсов информатики в начальных классах.


 
DVM   (2003-05-12 10:25) [20]


> не обращай на DVM ©, это локальный баг, чиста конкретно
> его...

Неужели у меня баг? Так как я описал у меня сортирует CompareString()


 
Palladin   (2003-05-12 10:30) [21]


> DVM © (12.05.03 10:25)

проверь исполнение этого выражения

if CompareStr("2","11")>0 then Application.MessageBox("2 > 11","Result") else Application.MessageBox("11 > 2","Result");


 
R   (2003-05-12 10:54) [22]

Вроде материал для анализа есть.
Буду думать далее.
Спасибо за хорошее разъяснение >Digitman ©
За пример >Palladin © хоть он что то не работает
ругается на эту строчку MyIntegers.Sort(@CompareIntegers);
Ну и всем Вам люди добрые. До встечи в инете.


 
REP   (2003-05-12 13:07) [23]

А может, когда вливаешь в StringList, записывать числа с нулями впереди, для некоторых случаев подходит, вроде как:
0001
0011
0033


 
Serginio   (2003-05-12 14:00) [24]

Все сортировки используют QuikSort который прекрасно подходит для сортировки уже сформированного массива (К коим можно отнести TStringList и ТList). TList и TStringList очень плохо подходят для динамической сортировки более 10 тыс (из за перераспределения памяти так как используется непрерывный массив). Здесь лучше использовать Б деревья которые динамически сортируют 1 мл. за 1 сек.


 
konstantinov   (2003-05-12 18:47) [25]

>Palladin © (12.05.03 10:21)
Эх! Опередили!!! ИМХО вместо MyIntegers.Sort(@CompareIntegers);
нужно MyIntegers.Sort(CompareIntegers);
Кстати TList может хранить разнотипные данные и в обработчике TList.Sort(Compare) можно написать все, что угодно! Сравнивай хоть напильники с урожаем кокосов в Африке. :))



 
R   (2003-05-13 01:59) [26]

>Serginio можете пример привести:
Б деревья которые динамически сортируют 1 мл. за 1 сек.


 
SergeSV   (2003-05-13 16:56) [27]

Елы-палы че так все сложно то? CustomSort - действительно универсальный вариант, но, если лень писать лишний код добавь к каждому числу пробелы, в конец (5, там 10 или 20 штук - смотря какая разрядность у тебя) и отсортируй стандартно


 
SergeSV   (2003-05-13 17:04) [28]

Сори, :) уточняю - пробелов нужно добавлять разное количество, так, чтобы все строки были одной длины. Используй функцию StringOfChar


 
Romkin   (2003-05-13 17:13) [29]

Что вы все к TStringList прицепились? Человеку вроде числа сортировать надо...

procedure Sort(var A: array of Integer);

procedure QuickSort(var A: array of Integer; iLo, iHi: Integer);
var
Lo, Hi, Mid, T: Integer;
begin
Lo := iLo;
Hi := iHi;
Mid := A[(Lo + Hi) div 2];
repeat
while A[Lo] < Mid do Inc(Lo);
while A[Hi] > Mid do Dec(Hi);
if Lo <= Hi then
begin
VisualSwap(A[Lo], A[Hi], Lo, Hi);
T := A[Lo];
A[Lo] := A[Hi];
A[Hi] := T;
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo then QuickSort(A, iLo, Hi);
if Lo < iHi then QuickSort(A, Lo, iHi);
if Terminated then Exit;
end;

begin
QuickSort(A, Low(A), High(A));
end;


 
Romkin   (2003-05-13 17:14) [30]

Что вы все к TStringList прицепились? Человеку вроде числа сортировать надо...

procedure Sort(var A: array of Integer);

procedure QuickSort(var A: array of Integer; iLo, iHi: Integer);
var
Lo, Hi, Mid, T: Integer;
begin
Lo := iLo;
Hi := iHi;
Mid := A[(Lo + Hi) div 2];
repeat
while A[Lo] < Mid do Inc(Lo);
while A[Hi] > Mid do Dec(Hi);
if Lo <= Hi then
begin
T := A[Lo];
A[Lo] := A[Hi];
A[Hi] := T;
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo then QuickSort(A, iLo, Hi);
if Lo < iHi then QuickSort(A, Lo, iHi);
if Terminated then Exit;
end;

begin
QuickSort(A, Low(A), High(A));
end;


 
Palladin   (2003-05-13 17:32) [31]


> Romkin © (13.05.03 17:14)

ну лично я распутал человека когда он запутался, R (12.05.03 07:52)
а сортировка сама по себе это вообще школьная программа и найти на эту тему информации можно и без форума



> konstantinov © (12.05.03 18:47)

пример использования TList.Sort из справки
function CompareNames(Item1, Item2: Pointer): Integer;
begin
Result := CompareText((Item1 as TComponent).Name, (Item2 as TComponent).Name);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
List1.Sort(@CompareText);
end;


> R (12.05.03 10:54)

все прекрасно работает и ни на что не ругается, хотя не знаю какая ситуация с d5...


 
Serginio   (2003-05-14 14:38) [32]

>R (13.05.03 01:59)
http://www.1c.hippo.ru/cgi-bin/predownl.cgi?id=2019
Там есть исходники объекта типа Б дерева и сравнение с динамической сортировкой TList. Для статической сортировки (то есть сортировка массива определенной длины лучше QuickSort ничего нет )



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

Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.008 c
1-83508
Ш-К
2003-05-15 23:36
2003.05.26
Проверка на приведение типов.


14-83733
vopros
2003-05-07 10:19
2003.05.26
Как в dgridEh фокус (подсвеченая строка) менять его цвет?


3-83418
Taktic
2003-05-06 03:41
2003.05.26
Сетевая база данных MS SQL 7.0 Delph6 ADO


4-83832
Angel Potion
2003-03-24 19:54
2003.05.26
Как можно ненадолго (на несколько миллисекунд) приостановить выполнение потока, и чтобы при этом поток не тормозил всю систему. Sleep с количеством миллисекунд тормозит, и причём изрядно.


3-83355
Antoxa
2003-05-06 03:09
2003.05.26
Подскажите, как программно изменить тип поля в таблице





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский