Главная страница
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.027 c
3-1122965252
Cheaterr
2005-08-02 10:47
2005.09.11
Как в Access создавая отчет, добавить данные из 2 запросов


2-1123534323
timon84
2005-08-09 00:52
2005.09.11
Передача переменной между прцедурами


3-1122696560
Ярослав
2005-07-30 08:09
2005.09.11
Не запускается FB Server


14-1124106658
inic
2005-08-15 15:50
2005.09.11
Почти опрос. Какой музыкальный редактор вы бы посоветовали ?


2-1123500160
Storm
2005-08-08 15:22
2005.09.11
SQL Server