Форум: "Прочее";
Текущий архив: 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