Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"Человеческая" сортировка


Andry ©   (2005-08-18 15:33:00) 

Подскажите возможно ли отсортировать список значений к примеру 1,2,3,4,10 а не как это делает комп 1,10,2,3,..?


TStas   (2005-08-19 01:51:00) [1]

>sniknik
Согласен, у меня где-то готовая функция была. Про мемо я догадался, что надо сортировать некий список, ну не TList же, а так в Мемо можно посмотреть.


Наиль   (2005-08-18 21:18:00) [2]

>[6]
Замняем
Result:= StrToIntDef(S1, 0) - StrToIntDef(S2, 0);
на
Result:=CompNumStr(s1,s2);
И мемо будет отсортирован, как надо.


sniknik   (2005-08-18 20:46:00) [3]

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 20:45:00) [4]

Популярный вопрос.
Вариант 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

Следует только учитывать, что такое коичество проверок и рекурсия делают алгоритм медленым.


TStas   (2005-08-18 19:45:00) [5]

Копирою содержимое Мемо, заполненное случайными числами в 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 15:41:00) [6]

> Andry   (18.08.05 15:33)

Сортирует не комп, а программа. И сортирует правильно - как у Вас написано в строках, так и сортирует.

01, 02, 03, ... 10 - устроит? Все отсортируется нормально.

Если не устроит, то сортируйте по численным , а не по строковым значениям.


Defunct   (2005-08-18 15:37:00) [7]

если "1", "2", "10" это строки.. то комп сортирует верно.


MetalFan   (2005-08-18 15:36:00) [8]

Удалено модератором


Наверх

Титульная страница Поиск, карта сайта Написать письмо