Главная страница
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.054 c
1-1124727045
Juice
2005-08-22 20:10
2005.09.11
Выполнить ПРОИЗВОЛЬНУЮ функцию(или метод) в отдельном потоке


1-1124537570
Агент Х-СОМ
2005-08-20 15:32
2005.09.11
отладка компонентов


14-1124394320
SergProger
2005-08-18 23:45
2005.09.11
Хочу скачать книжку


1-1124713505
Сергей Никонов
2005-08-22 16:25
2005.09.11
Странное сообщение от Delphi


14-1124102465
Е-клмн
2005-08-15 14:41
2005.09.11
Господа! Сколько часов в день вы спите? А сколько работаете?