Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.053 c
6-1116268479
olevacho_
2005-05-16 22:34
2005.09.11
Определение работают ли в интернет на компе


2-1123502285
M@rlin
2005-08-08 15:58
2005.09.11
запрос к БД из Дельфи


1-1124246472
anton_321
2005-08-17 06:41
2005.09.11
как выводить изображение в DBGrid.


11-1106665752
Boguslaw
2005-01-25 18:09
2005.09.11
Bitmap.LoadFromResourceName


4-1122004287
Jet
2005-07-22 07:51
2005.09.11
Печать на принтер Olivetti PR2 из Дельфи