Страницы

Поиск по вопросам

среда, 4 декабря 2019 г.

Как обеспечить нормальную сортировку для папок

#файлы #сортировка


Предположим, есть главы с 1 по 8. Чуть позже автор добавляет условный бонус 7.5.

Теперь, я хочу делать довольно однообразное именование глав, изначальная идея "Глава
0001" к примеру. Стабильно работает (пока глав меньше 10к, да) сортировка, пока не
появляются бонусные главы.

Есть у кого хорошие идеи, как можно именовать главы, чтобы бонусы (особенно добавленные
задним числом), не ломали сортировку и не попадали в самый конец или куда то в середину?

ПС: особенно добавляет удовольствия то, что точка в имени сортируется по разному
на win/unix/android и в различных приложениях на этих ОС.


    


Ответы

Ответ 1



Когда-то подобная проблема была и в бейсике, в котором нужно было нумеровать строки. И там было простое правило - строки нумеровать десятками. И если нужно вставить строку-две, проблемы не возникает. Подобная система перекочевала и в линуксовские конфиги. Поэтому, главы нумеруем десятками (или сотнями даже), добавляя в начале нужное кол-во нулей. Если нужно вставить главу по середине - проблемы нет. Пример имен файлов. 0010-1-chapter 0020-2-chapter 0030-3-chapter 0040-4-chapter 0050-5-chapter 0060-6-chapter 0070-7-chapter 0075-7-bonus 0080-8-chapter Этот способ хорош тем, что если даже нужно будет вставить "интро", то просто нумеруем с 0000-..., 0005-..... Зачем нужны нули в начале? В таком случае сортироваться будет везде одинаково. Проводник умеет понимать и без нулей, а другие заменители - не факт. Количество начальных нулей выбирается исходя с предполагаемого кол-ва глав. Почему без точки? А точка не несет дополнительной информации. А вот разделитель нумерации и просто имени - нужен. Он упростит регулярки и другую рутину.

Ответ 2



А почему просто точка не подходит? вариант 1, 2, 3.1, 3.2, 3.2.4, 3.2.5, 4, 5, ... сортируютется и на Unix, и на Windows, и на Android одинаково Если глав больше 10, 100, 1000, то нужно только первые нули добавить. Точка при этом сортируется одинаково везде (проверил на Android, Win 7, CentOS, Linux)

Ответ 3



Что тут важно: Лексикографическая сортировка совпадает с желаемой. Сортировка с учётом целых чисел совпадает с лексикографической. Для этого нужны лидирующие нули, приводящие все числа к одинаковой длине. В качестве разделителя используется не точка, чтобы предотвратить сортировку с учётом дробных чисел, либо сортировка с учётом дробных чисел совпадает с лексикографической. Т. е. надо использовать одинаковое число знаков в дробной части. Ни одно название не заканчивается сразу после номера. Там должен стоять символ, который гарантированно меньше разделителя. На эту роль подходит пробел. Название не заканчивается и не начинается с точки или пробела. Поскольку в конце они не поддерживаются в виндоусе, в начале точка означает скрытость в линуксе, а пробел в начале местами сортируется неожиданным образом. Поэтому можно не писать слово Глава в начале. И надо добавить название самой главы в конец через пробел. В таком случае пробел будет раньше чем точка или подчёркивание и всё встанет в нужном порядке. 0001 Какая-то первая глава 0002 Ну да, вторая 0003 А может трилогия 0003.50 Да, я умею вставлять в середину 0003.75 И не только в середину 0004 Неожиданное продолжение Как оказалось, у Linux Mint какие-то свои представления о сортировке числовых значений, пробелов, точек и знаков пунктуации. Чтобы побороть их и свести сортировку к лексикографической, пришлось: Добавить точку в конец номера главы. Использовать точку с запятой в качестве разделителя. Получается такой формат: 001. Какая-то папка 002. Ну и ещё что-то тут 002;5. Половинная 002;7. Ещё одна 003. Тетья на месте 004. И четвёртая - последняя С этим форматом согласен проводник: но, к сожалению, не консоль:

Ответ 4



0001.a whatever 0002.a more stuff 0003.a 0004.a wow бонусы добавляют после .a: 0002.a.1 superbonus 0002.a.2 nothing

Ответ 5



Распарсить все названия, извлечь из них все номера в отдельную структурку/столбец или что там у тебя. Быть может быть несколько раз. Затем отсортировать по основному принципу, затем по этим дополнительным столбцам. Примерно такое реализовано в проводнике Вин7. Сначала нравится, потом жутко бесит.

Комментариев нет:

Отправить комментарий