4

我正在使用eachFile(),但我试图颠倒迭代发生的顺序。我怎么做?现在,它似乎对文件列表进行排序,然后按排序顺序处理每个文件。我本质上想对该列表进行保留排序并从末尾开始。

4

3 回答 3

11

我相信你不能改变 的顺序eachFile(),但你可以达到预期的效果。

考虑:

new File("desired dir").listFiles().sort{ it.name }.reverse().each { def f ->
    println f.name
}
于 2013-06-03T00:06:50.300 回答
1

您不能eachFile直接使用,但使用listFiles和手动排序执行此操作非常简单:

new File(path_to_file).listFiles().sort{a,b -> b.name <=> a.name}.each{ File f ->
    println f.name
}

这里的关键sort{}是倒置的。(如果您只使用reverse()on listFiles(),则无法保证来自文件系统的任何特定顺序 - 文件可能以特定于系统的顺序出现。)

请注意,该排序区分大小写——您可以像这样进行不区分大小写的排序:

new File(path_to_file).listFiles().sort{a,b -> b.name.compareToIgnoreCase(a.name)}.each{ File f ->
    println f.name
}

在 Groovy 2.1.3 下测试。

于 2013-06-02T23:56:31.227 回答
1

我知道的最简单的方法是

def allFiles = new File('desired directory').listFiles()?.sort{a, b ->
    -(a.name <=> b.name)
}

eachFile不能sort在闭包中使用。

显式使用的好处sort是您可以根据排序标准对文件进行排序。例如,根据文件的lastModified日期对文件进行排序:-

def allFiles = new File('desired directory').listFiles()?.sort{a, b ->
        a.lastModified() <=> b.lastModified()
        //to reverse sort on lastModified date use below
        //-(a.lastModified() <=> b.lastModified())
    }
于 2013-06-02T23:56:50.020 回答