Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.11.24;
Скачать: CL | DM;

Вниз

Про сортировочку   Найти похожие ветки 

 
Дмитрий СС   (2013-06-03 12:02) [40]


> в каком проводнике? у меня в Вин7 (и 2008 сервер) как раз
> такая сортировка, как бы ее отключить... а на ХР папки и
> файлы отдельно

И у меня win7, а можешь скриншот прислать?


 
Sha ©   (2013-06-03 12:05) [41]

Запостил и, кажется, понял, зачем MS так с нулями обходится.
Они смотрят на имя файла как на десятичную дробь:
1.2
2.03
2.3


 
antonn ©   (2013-06-03 12:16) [42]


>
> И у меня win7, а можешь скриншот прислать?

это чтоли? http://antonn.com/fh/store/3wboph7h.jpg


 
antonn ©   (2013-06-03 12:18) [43]

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


 
Дмитрий СС   (2013-06-03 12:26) [44]


> однако далеко не все папки так сортируются, некоторые привычно
> раздельно

Да даже на твоем примере - одна дата не в кассу.

Мне хочется чтобы в папке Загрузки файлы и папки были исключительно по времени. Скачал архив, распаковал - папка и архив рядом и на самом верху.

В общем не сортировка, а какая то загадка.


 
Inovet ©   (2013-06-03 12:28) [45]

> [44] Дмитрий СС   (03.06.13 12:26)

Пользуйся FAR.:)


 
antonn ©   (2013-06-03 12:42) [46]


>
> Да даже на твоем примере - одна дата не в кассу.

это скриншот неудачный, но я точно помню что не раз бился с такой сортировкой когда "синхронизировал" две папки с разных компов и там файлы с папками были вперемежку


 
Rouse_ ©   (2013-06-03 12:43) [47]


> использование подобных "функций" это удел батонокидателей
> должно быть чистое логическое условие  ( c > "/" ) and (
> c < ":" ), без всяких множеств

И так нормально.


> Sha ©   (03.06.13 11:58) [39]
> > Rouse_
>
> Нулевое значение - это частный случай лидирующих нулей,
> хорошо бы их тоже обрабатывать.
>
> 1
> 01
> 001
> 0001
> 00001

Хм, в принципе да, но как-то не так смотрится...

Поправить то в принципе просто:

     //if S1Int = 0 then
     if (S1Cursor^ = S2Cursor^) and (S1Cursor^ = #0) then


 
Sha ©   (2013-06-03 12:50) [48]

> Rouse_
> Хм, в принципе да, но как-то не так смотрится...


Ты уж определись, как тебе так.
Так, как MS, или не так )


 
Rouse_ ©   (2013-06-03 12:59) [49]

В MS задом на перед.

А тут получается вот такая ситуация (вой вариант алго с учетом нулей):

0
1
01
0001
001_b
01_a
2

хотя по логике надо бы

0
01
01_a
001
001_b
0001
1
2

короче есть еще где подумать :)


 
Sha ©   (2013-06-03 13:07) [50]

значит условие [47] надо помениять, чтоб учитывать длину числа


 
Rouse_ ©   (2013-06-03 14:18) [51]


> Sha ©   (03.06.13 13:07) [50]

И длину числа и количество нулей, для получения приемливого результата.

0
00
01
01_b
000
001
001_a
0001
1

2

В итоге можно сделать вот так:

function CompareStringOrdinal(const S1, S2: string): Integer;
var
 S1IsInt, S2IsInt: Boolean;
 S1Cursor, S2Cursor: PChar;
 S1Int, S2Int, Mutiplier, S1ZeroCount, S2ZeroCount, S1IntLength, S2IntLength: Integer;
 SingleByte: Byte;
begin
 // Проверка на пустые строки
 if S1 = "" then
   if S2 = "" then
     Exit(0)
   else
     Exit(-1);

 if S2 = "" then Exit(1);

 S1Cursor := @AnsiLowerCase(S1)[1];
 S2Cursor := @AnsiLowerCase(S2)[1];

 while True do
 begin
   // проверка на конец первой строки
   if S1Cursor^ = #0 then
     if S2Cursor^ = #0 then
       Exit(0)
     else
       Exit(-1);

   // проверка на конец второй строки
   if S2Cursor^ = #0 then Exit(1);

   // проверка на начало числа в обоих строках
   S1IsInt := CharInSet(S1Cursor^, ["0".."9"]);
   S2IsInt := CharInSet(S2Cursor^, ["0".."9"]);
   if S1IsInt and not S2IsInt then Exit(-1);
   if not S1IsInt and S2IsInt then Exit(1);

   // посимвольное сравнение
   if not (S1IsInt and S2IsInt) then
   begin
     if S1Cursor^ = S2Cursor^ then
     begin
       Inc(S1Cursor);
       Inc(S2Cursor);
       Continue;
     end;
     if S1Cursor^ < S2Cursor^ then
       Exit(-1)
     else
       Exit(1);
   end;

   // вытаскиваем числа из обоих строк и сравниваем
   S1Int := 0;
   Mutiplier := 1;
   S1ZeroCount := 0;
   S1IntLength := 0;
   repeat
     Inc(S1IntLength);
     SingleByte := Byte(S1Cursor^) - Byte("0");
     if (SingleByte = 0) and (S1Int = 0) then
       Inc(S1ZeroCount); // запоминаем количество нулей предшествующих числу
     S1Int := S1Int * Mutiplier + SingleByte;
     Inc(S1Cursor);
     Mutiplier := 10;
   until not CharInSet(S1Cursor^, ["0".."9"]);

   S2Int := 0;
   Mutiplier := 1;
   S2ZeroCount := 0;
   S2IntLength := 0;
   repeat
     Inc(S2IntLength);
     SingleByte := Byte(S2Cursor^) - Byte("0");
     if (SingleByte = 0) and (S2Int = 0) then
       Inc(S2ZeroCount); // запоминаем количество нулей предшествующих числу
     S2Int := S2Int * Mutiplier + SingleByte;
     Inc(S2Cursor);
     Mutiplier := 10;
   until not CharInSet(S2Cursor^, ["0".."9"]);

   // Если длина числел одинаковая, сравниваем обычным способом
   if S1IntLength = S2IntLength then
   begin
     if S1Int = S2Int then
       Continue;

     if S1Int < S2Int then
       Exit(-1)
     else
       Exit(1);
   end;

   // в противном случае, если оба числа начинаются с нулей,
   // то число, у которого нулей меньше идет первым
   if (S1ZeroCount <> 0) and (S2ZeroCount <> 0) then
   begin
     if S1ZeroCount < S2ZeroCount then Exit(-1);
     if S1ZeroCount > S2ZeroCount then Exit(1);
   end;

   // если оба числа равны, то проверяем на наличие нулей перед одним из чисел
   // если такое число находится - оно идет первым
   if S1Int = S2Int then
   begin
     if S1ZeroCount > S2ZeroCount then Exit(-1);
     if S1ZeroCount < S2ZeroCount then Exit(1);
     Continue;
   end;

   // ну а если не равны, то то котое меньше идет первым
   if S1Int < S2Int then
     Exit(-1)
   else
     Exit(1);
 end;
end;


Но такая сортировка спорная, поэтому обновлять наверное не буду :)


 
Sha ©   (2013-06-03 14:26) [52]

> Rouse_
> Но такая сортировка спорная, поэтому обновлять наверное не буду :)


Мне кажется отсюда следует, что у MS сортировка правильная )


 
Rouse_ ©   (2013-06-03 14:41) [53]


> Мне кажется отсюда следует, что у MS сортировка правильная
> )


у них так:

0000
000
000_A
000_B
00
0
1
2
10
20

С нулями перегиб...


 
Sha ©   (2013-06-03 14:50) [54]

Это нормально, если считать, что справа неуместилась (вывалилась за отведенное место) значащая цифра дробного числа .0000х

Как я понимаю, у них логика следующая.
Число считается целым, если начинается не с нуля, иначе - дробным.

Подробнее алгоритм сравнения выглядит так:
1. Если первая цифра числа не нуль и длины чисел разные, то больше то, что длиннее.
2. Иначе посимвольное сравнение.


 
Sha ©   (2013-06-03 15:01) [55]

* не уместилась

можно также считать, что эта цифра совсем маленькая, меньше 1 ))


 
Дмитрий СС   (2013-06-04 12:43) [56]

Может если число начинается с нуля, сортировка МС считает что пользователь специально так сделал для правильной сортировки?


 
pasha_golub ©   (2013-06-05 10:35) [57]

Не думал я, Саня, что возлияния на тебя так могут повлиять. Что дальше? Пузырёк изобретёшь? ;)


 
Юрий Зотов ©   (2013-06-05 18:48) [58]


> pasha_golub ©   (05.06.13 10:35) [57]
>  Что дальше? Пузырёк изобретёшь? ;)

После 22-х - изобретение вполне достойное.


 
Rouse_ ©   (2013-06-05 19:35) [59]


> pasha_golub ©   (05.06.13 10:35) [57]
> Не думал я, Саня, что возлияния на тебя так могут повлиять.
>  Что дальше? Пузырёк изобретёшь? ;)

Паша, не нужно было дышать на меня сивухой хохляцкой, её аромат дал о себе знать :)


> Юрий Зотов ©   (05.06.13 18:48) [58]
> После 22-х - изобретение вполне достойное.

Сморя по какой пузырек речь, Менделеев оть аще спал, но придумал-же :)


 
Розалия Самойловна   (2013-06-06 13:20) [60]


> pasha_golub ©   (05.06.13 10:35) [57]
> Паша, не нужно было дышать на меня сивухой хохляцкой, её аромат дал о себе знать :)

Павел, Вы разве еще бухаете ?


 
Розалия Самойловна   (2013-06-06 13:36) [61]


> Юрий Зотов ©   (01.06.13 16:00) [21]
> Дык... Розыч ведь так и сразу написал, что это бантик. И ежу понятно, что способ сортировки может зависеть от контекста.

Юрий.
В том то и дело, что этот вид сортировки имеет только академическое применение. Или другими словами - таки бантик.
Ведь основная претензия с моей стороны была в том, что сущности, а именно строка и число, искусственно разделяются, проводиться отдельная сортировка по числу, а потом соединяются вновь. Но гораздо проще хранить эти сущности отдельно и соединять только при отображении, а не применять псевдо-ИИ.



Страницы: 1 2 вся ветка

Текущий архив: 2013.11.24;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.008 c
15-1370631977
NanoWeber
2013-06-07 23:06
2013.11.24
форумы нано


2-1361176045
Glock
2013-02-18 12:27
2013.11.24
64-бит паддинг


2-1360932357
alexdn
2013-02-15 16:45
2013.11.24
Веб браузер


15-1370514261
garant
2013-06-06 14:24
2013.11.24
Нужен программист Delphi


1-1319001199
hoolio
2011-10-19 09:13
2013.11.24
Функция скриншота кушает память