Текущий архив: 2005.09.11;
Скачать: CL | DM;
Вниз"Человеческая" сортировка Найти похожие ветки
← →
Andry (2005-08-18 15:33) [0]Подскажите возможно ли отсортировать список значений к примеру 1,2,3,4,10 а не как это делает комп 1,10,2,3,..?
← →
MetalFan © (2005-08-18 15:36) [1]Удалено модератором
← →
Defunct © (2005-08-18 15:37) [2]если "1", "2", "10" это строки.. то комп сортирует верно.
← →
Юрий Зотов © (2005-08-18 15:41) [3]> Andry (18.08.05 15:33)
Сортирует не комп, а программа. И сортирует правильно - как у Вас написано в строках, так и сортирует.
01, 02, 03, ... 10 - устроит? Все отсортируется нормально.
Если не устроит, то сортируйте по численным, а не по строковым значениям.
← →
TStas © (2005-08-18 19:45) [4]Копирою содержимое Мемо, заполненное случайными числами в TList, а потом сортировем TList.
function StrComp(p1, p2:Pointer):Integer;
var
x1, x2:Integer;
s1, s2:^String;
begin
s1:=p1;
s2:=p2;
try x1:=StrToInt(s1^) except x1:=0 end;
try x2:=StrToInt(s2^) except x2:=0 end;
Result:=x1-x2;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
list:TStringList;
ls:TList;
i:Integer;
ps:^String;
begin
ls:=TList.Create;
for i:=0 to Memo1.Lines.Count-1 do
begin
new(ps);
ps^:=Memo1.Lines[i];
ls.Add(ps);
end;
ls.Sort(StrComp);
list:=TStringList.Create;
for i:=0 to ls.Count-1 do
begin
ps:=ls[i];
list.Add(ps^);
Dispose(ps);
end;
Memo1.Lines.Assign(list);
Memo1.Lines.Assign(list);
list.Free;
ls.Free;
end;
← →
Наиль © (2005-08-18 20:45) [5]Популярный вопрос.
Вариант TStas подходит для чисел.
Мой вариант:function CompNumStr(s1,s2:string): Integer;
Var
s,ns:array[1..2] of string;
n,x:array[1..2] of int64;
i,j:integer;
begin
result:=0;
if s1=s2 then Exit;
s[1]:=trim(s1);
s[2]:=trim(s2);
For j:=1 to 2 do Begin
ns[j]:="";
For i:=1 to Min(18,Length(s[j])) do
if s[j][1] in ["0".."9"] then Begin
ns[j]:=ns[j]+s[j][1];
Delete(s[j],1,1);
End else break;
if ns[j]<>"" then Begin
x[j]:=1;
n[j]:=StrToInt64(ns[j]);
End else x[j]:=2;
End;
i:=x[1]*10+x[2];
Case i of
11: Begin
result:=n[1]-n[2];
if result=0 then result:=CompNumStr(s[1],s[2]);
End;
12: result:=-1;
21: result:=1;
22: if (length(s[1])=0) or (length(s[2])=0) or (s[1][1]<>s[2][1])
then result:=AnsiCompareStr(s[1],s[2])
else Begin
While (length(s[1])>0) and (length(s[2])>0)
and (s[1][1]=s[2][1]) and not (s[1][1] in ["0".."9"]) do Begin
Delete(s[1],1,1);
Delete(s[2],1,1);
End;
result:=CompNumStr(s[1],s[2]);
End;
else result:=0;
End;
end;
сортирует списки по следующему принципуБыло Стало
1а 1а
Вася2 1б
2а 2а
1б 10а
Петя2 Вася1
10а Вася2
Вася1 Вася10
Петя1 Петя1
Вася10 Петя2
Следует только учитывать, что такое коичество проверок и рекурсия делают алгоритм медленым.
← →
sniknik © (2005-08-18 20:46) [6]TStas © (18.08.05 19:45) [4]
если идти по такому пути, тоtype
TMyStringList = class(TStringList)
function CompareStrings(const S1, S2: string): Integer; override;
end;
TForm1 = class(TForm)
Memo1: TMemo;
....
function TMyStringList.CompareStrings(const S1, S2: string): Integer;
begin
Result:= StrToIntDef(S1, 0) - StrToIntDef(S2, 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
list: TMyStringList;
begin
list:= TMyStringList.Create;
try
list.Assign(Memo1.Lines);
list.Sort;
Memo1.Lines.Assign(list);
finally
list.Free;
end;
end;
меньше писать.
а откуда ты узнал что "Человеческая" сортировка должна происходить именно в мемо? телепат? ;о))
← →
Наиль © (2005-08-18 21:18) [7]>[6]
ЗамняемResult:= StrToIntDef(S1, 0) - StrToIntDef(S2, 0);
наResult:=CompNumStr(s1,s2);
И мемо будет отсортирован, как надо.
← →
TStas © (2005-08-19 01:51) [8]>sniknik
Согласен, у меня где-то готовая функция была. Про мемо я догадался, что надо сортировать некий список, ну не TList же, а так в Мемо можно посмотреть.
Страницы: 1 вся ветка
Текущий архив: 2005.09.11;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.011 c