【问题标题】:ruby > sort images inside directory with multiple conditionsruby > 使用多个条件对目录内的图像进行排序
【发布时间】:2014-05-30 11:49:38
【问题描述】:

我需要按以下顺序对某个目录中存在的图像进行排序:

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| ?? }

谢谢, 院长

【问题讨论】:

  • 您能用文字定义您的排序顺序吗?你的例子似乎有点不一致......
  • @UriAgassi 哦,天哪,我一定是不小心向上滚动的。我会删除该评论。

标签: ruby file sorting directory rmagick


【解决方案1】:

您请求的排序顺序不明显,因此我假设您希望所有包含字母的图像都排在仅包含数字的图像之前

对于这个逻辑,您可以从 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"
]

【讨论】:

    【解决方案2】:

    我会使用:

    Dir.entries('.').sort { |a,b| a.split('.').first <=> b.split('.').first }

    我认为它可能比正则表达式选项更快。此外,它更简单、更易于定制(由于使用了 2 个迭代器和比较器)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多