Главная страница
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.029 c
2-1123529338
Nox777
2005-08-08 23:28
2005.09.11
Edit только для цифр?


14-1124115907
Андрей Жук
2005-08-15 18:25
2005.09.11
Зато мы в ЧГК играть умеем :)


1-1124696985
_Landgraf_
2005-08-22 11:49
2005.09.11
Использование RichEdit


1-1124693266
DVM
2005-08-22 10:47
2005.09.11
Помогите с разбором HTTP ответа сервера (IP-камеры).


1-1124729415
futility
2005-08-22 20:50
2005.09.11
работа с IE и вообще с браузерами