Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.11.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
Дмитрий СС   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.004 c
15-1370594895
Новичок 4444
2013-06-07 12:48
2013.11.24
Как стать программистом ?


15-1370631977
NanoWeber
2013-06-07 23:06
2013.11.24
форумы нано


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


15-1370252706
И. Павел
2013-06-03 13:45
2013.11.24
Жизнь на 17 этаже


11-1249020271
MTsv DN
2009-07-31 10:04
2013.11.24
Работа с ассоциациями файлов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский