这个问题已经有了答案:
Is there a natural_sort_by method for Ruby?
6答
是的,它是Is there a natural_sort_by method for Ruby?的复制品,但我认为dawg和eric在这里更清楚了,至少对我来说,这些答案更详尽。
我有一个这样的数组:

arr = ["file1.txt", "file11.txt", "file12.txt", "file2.txt", "file3.txt"]

我想这样分类:
arr = ["file1.txt", "file2.txt", "file3.txt", "file11.txt", "file12.txt"]

我该怎么做?我试过用sort,但我不太清楚。
我按大小对文件进行了如下排序:
files=Dir.entries("./").sort { |f| File.size(f) }.select { |f| File.file?(f) }

最佳答案

埃里克的回答是对文件名中的数字进行Natural Sort Order运算的好方法。如果所有文件名具有相同的前缀,则有效。
如果要添加第二个元素(例如,文件名中没有数字),可以通过创建列表来实现多元素排序:

filenames = ["file1.txt", "file11.txt", "file12.txt", "file2.txt", "file3.txt","file.txt", "File.txt"]
filenames.sort_by{ |name| [name[/\d+/].to_i, name] }
=> ["File.txt", "file.txt", "file1.txt", "file2.txt", "file3.txt", "file11.txt", "file12.txt"]

sort_by的两个元素实现:
整数位数(如果有)与regexname[/\d+/].to_i一起找到,则
如果没有数字或相同的数字,则命名。
更强大的是,您可以按数字拆分整个字符串,并将每个字符串转换为int:
> "abc123def456gh".split(/(\d+)/).map{ |e| Integer(e) rescue e}
=> ["abc", 123, "def", 456, "gh"]

所以你的天性变成:
arr.sort_by{ |s| s.split(/(\d+)/).map{ |e| Integer(e) rescue e}}

因此,现在名称和数字(甚至是名称和数字的倍数)被正确处理:
> arr = ["file1.txt", "file11.txt", "file12.txt", "file2.txt", "file3.txt", "gfile10.txt", "gfile1.txt", "gfile.txt", "file.txt", "afile.txt","afile10.txt","afile2.txt" ]
> arr.sort_by{ |s| s.split(/(\d+)/).map{ |e| Integer(e) rescue e}}
=> ["afile2.txt", "afile10.txt", "afile.txt", "file1.txt", "file2.txt", "file3.txt", "file11.txt", "file12.txt", "file.txt", "gfile1.txt", "gfile10.txt", "gfile.txt"]

关于arrays - 如何在ruby中对文件名进行排序? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51341134/

10-14 18:23
查看更多