是的,它与Ruby是否存在natural_sort_by方法的副本相同?,但我认为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) }
Eric的答案是对仅文件名中的数字进行自然排序的好方法。如果所有文件名都具有相同的前缀,则可以使用。
如果要添加第二个元素(例如,其中没有数字的文件名),则可以通过创建列表来实现多元素sort_:
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
:
name[/\d+/].to_i
则name
。更强大的是,您可以按数字分割整个字符串,并将每个字符串转换为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"]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句