我需要按照以下顺序对某个目录中的图像进行排序:
00a.jpg
00b.jpg
00c.jpg
...
00x.jpg
00y.jpg
00z.jpg
0aa.jpg
0bb.jpg
0cc.jpg
...
0xx.jpg
0yy.jpg
0zz.jpg
001.jpg
002.jpg
003.jpg
...
097.jpg
098.jpg
099.jpg
100.jpg
101.jpg
102.jpg
但是我没有任何逻辑可以放入我的sort_by?任何人都可以知道什么逻辑最适合按上述顺序对所有图像进行排序..
我期待这样的事情:
Dir.entries('.').sort_by { |x| ?? }
谢谢, 迪安
答案 0 :(得分:3)
您要求的排序顺序并不明显,所以我假设您希望所有包含字母的图像都在仅包含数字的图像之前。
对于这个逻辑,你可以从sort_by
返回一个数组,该数组按顺序进行评估 - 第一项为第一项,如果第一项被并列第二项,等等。
在这个例子中,这将是:
jpgs.sort_by { |j| [j[/.*[a-z].*\.jpg/] ? 0 : 1, j] }
返回的数组中的第一项回答了图像名称是否在扩展名之前包含字母的问题,如果它确实返回的数字小于不包含字母的数字。这样可以确保我们名字中带有字母的图像将位于图像前面只有数字的图像。
将导致此顺序:
[
"00a.jpg",
"00b.jpg",
"00c.jpg",
"00x.jpg",
"00y.jpg",
"00z.jpg",
"0aa.jpg",
"0bb.jpg",
"0cc.jpg",
"0xx.jpg",
"0yy.jpg",
"0zz.jpg",
...,
"001.jpg",
"002.jpg",
"003.jpg",
"097.jpg",
"098.jpg",
"099.jpg",
"100.jpg",
"101.jpg",
"102.jpg"
]
答案 1 :(得分:0)
我会用:
Dir.entries('.').sort { |a,b| a.split('.').first <=> b.split('.').first }
我认为它可能比regexp选项更快。此外,它更简单,更容易定制(由于使用了2个迭代器和比较器)。