【问题标题】:Sort files based on incomplete array of filenames根据不完整的文件名数组对文件进行排序
【发布时间】:2015-01-20 05:17:22
【问题描述】:

给定一个包含三个文件fileA, fileB, fileC 的目录,我可以按照我希望它们排序的顺序创建一个数组,如下所示:

prio = [ "fileC", "fileA", "fileB" ]
#=> ["fileC", "fileA", "fileB"]
Dir.glob("*").sort_by { |i| [prio.index(i), i] }
#=> ["fileC", "fileA", "fileB"]

但是,我尝试按字母顺序对目录中的其他任何内容进行排序 prio 数组中的那些,但是只要我添加第四个文件,我就会得到:

Dir.glob("*").sort_by { |i| [prio.index(i), i] }
ArgumentError: comparison of Array with Array failed
from (irb):3:in `sort_by'
from (irb):3
from :0

我曾尝试使用if prio.include?(i) 作为块内的条件,但后来我得到:

TypeError: can't convert nil into Array from (irb):4:in `'

我正在使用 ruby​​-1.8.7。有什么建议吗?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    这看起来可以做到:

    prio = %w[ fileC fileA fileB ]
    files = %w[foo fileA bar fileB baz fileC]
    prio_files = prio & files  # => ["fileC", "fileA", "fileB"]
    non_prio = files - prio_files # => ["foo", "bar", "baz"]
    process_order = prio_files + non_prio # => ["fileC", "fileA", "fileB", "foo", "bar", "baz"]
    

    如果您想对 non_prio 文件进行排序,请使用:

    process_order = prio_files + non_prio.sort
    

    有关详细信息,请参阅 Array 的 -&

    【讨论】:

    • 好的,Sn。我们在那里进行了一次心灵融合。顺便问一下,“唐娜”是谁?
    • 数组对集合的使用使得一些数组操作非常容易。
    • 我在提到想要手动添加超出优先级的文件的目标时过于含蓄了。但是,我可以将您的示例与Dir.glob 一起使用,然后删除两个数组中的那些文件。谢谢!
    • "...目标是不想手动添加超出优先级的文件。"然后你需要不微妙,并将这些要求添加到你提出的问题中。我不确定你的意思。您希望代码自动找出prio 文件吗?如果是这样,使用selectgrep 很容易做到这一点,但这会使您无法指定顺序。
    • @theTinMan 按字母顺序将目录中的其他内容排在 prio 数组之后, 这意味着我不想手动创建非优先文件数组。所以正如我在之前的评论中所说,我使用了Dir.glob 并减去了优先文件。
    【解决方案2】:

    [编辑:我最初删除了我的答案,因为它与@theTinMan 的基本相同,他在我发布我的之前几分钟就发布了。但是,鉴于您的评论,我取消删除它只是为了具体说明您的观点。]

    这是你想要的吗?

    all_files = Dir.glob("*")
    prio & Dir.glob("*") + (all_files-prio).sort
    

    【讨论】:

    • 这与我所做的非常接近。 prio + (all - prio).sort
    • 没关系,只要您确定prio 中的所有文件都在目录中即可。在生产环境中,如果您希望所有 prio 文件都存在,您可以确认这一点并在缺少任何文件时引发异常。然后如果他们都在那里,继续你所拥有的。
    猜你喜欢
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多