arrays - 如何在 ruby​​ 中对文件名进行排序?

标签 arrays ruby file sorting numbers

<分区>

是的,它是 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) }

最佳答案

Eric 的回答是仅对文件名中的数字执行 Natural Sort Order 的好方法。如果所有文件名都具有相同的前缀,则有效。

如果您想添加第二个元素(例如,其中没有数字的文件名),您可以使用多元素 sort_by 创建一个列表:

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 实现的两个元素:

  1. 如果用正则表达式找到数字的整数值 name[/\d+/].to_i then
  2. 姓名,如果没有数字或相同的数字 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"]

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

相关文章:

arrays - 如何将函数映射到数组的每个元素?

java - 非常快地写入文件

java - Android中如何加载和保存文件?

c++ - 在读取文本文件 C++ 时转义包含特殊字符的一行

arrays - 在 Clojure 中从类型特定数组创建通用数组

html - 我如何将每个换行符转换/替换为 '<br/>'?

arrays - 比较两个对象列表A和B的列表,并存储在 Dart 中的另一个列表C中

java - 为什么 Marathon 无法在组合框中正确选择?

php - 将 PDO 结果集数组转换为可访问的数组 PHP

javascript - 在数组中找到所有可能的子集组合?