我可以遍历文件名,找到字符串中的第一个数字,形成基本字符串,计数器 + 可能的填充和结束字符串并尝试匹配这些。然而,这听起来有点太乱了,让我觉得一定有更好的方法。但是有吗?
我想要一个简单的解决方案,因此我牺牲了内存并使用多个列表/映射来对名称进行排序/分组。我将字符串打包到带有额外字段的结构中以获取辅助信息。
我正在使用一个特殊的比较功能。它并不完全是 const,因为除了比较字符串之外,它还为每个条目提取并保存一个 prefix。 (实际上我是在比较 CVS 风格的文件版本,在我的例子中,前缀是分支的 id,序列是文件的相邻版本。)
它就是这样工作的。输入文件列表:
"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 与 prev 条目相比 +1。
IOW,这可能与您所做的没有太大区别。我根本不害怕在操作上投入一点内存/CPU,因为按照它们的文件操作无论如何都会更慢/更多的内存占用。