Я мог бы пройти через итерации имен файлов, найти первое число в строке, сформировать базовую строку, счетчик + возможные отступы и конечные строки и попытаться сопоставить их.Это, однако, звучит немного беспорядочно и заставляет меня думать, что должен быть лучший путь.Но есть ли?
Я хотел иметь простое решение, поэтому я пожертвовал памятью и использую несколько списков / карт для сортировки / группировки имен.Я упаковал строки в структуры с дополнительными полями для вспомогательной информации.
Я использую специальную функцию сравнения.Это не совсем const, поскольку наряду со сравниваемыми строками он также извлекает и сохраняет префикс для каждой записи.(На самом деле я сравниваю версию файла в стиле CVS, и префикс в моем случае - это идентификатор ветви, последовательности - это смежные версии файла.)
Это работает так.Список входных файлов:
"filename_00001.png"
"filename_00002.png"
"filename_00003.png"
Расширения первой полосы:
"filename_00001", "png"
"filename_00002", "png"
"filename_00003", "png"
Затем при сортировке извлекается префикс имени файла: имя - все цифры в конце.Если префиксы равны, тогда сравните числа.(В моем случае ввод не дополняется нулями):
"filename_00001", "png", "filename_"
"filename_00002", "png", "filename_"
"filename_00003", "png", "filename_"
После сортировки / извлечения префикса все последовательности имеют одинаковый префикс.Если в конце файла нет номера, полное имя файла является префиксом и по определению является уникальным.Вы также можете дополнительно сохранить извлеченный номер:
"filename_00001", "png", "filename_", 1
"filename_00002", "png", "filename_", 2
"filename_00003", "png", "filename_", 3
Теперь все они отсортированы и отсортированы правильно, вспомогательная информация подготовлена - все дальнейшие операции довольно тривиальны.Например, итерируя по списку, можно извлечь все последовательности с помощью простого правила: префикс одинаковый / seq num +1 по сравнению с предыдущей записью.
IOW, он может не сильно отличаться от того, что вы делаете.Я просто не боюсь потратить немного памяти / ЦП на операцию, так как после них файловые операции в любом случае медленнее / требуют больше памяти.