【发布时间】:2010-12-14 15:29:37
【问题描述】:
我很难过...假设我有这个目录树:
{someRoot}/
{someRoot}/bar/
{someRoot}/bar/file1.txt
{someRoot}/foo/
{someRoot}/foo/baz/
{someRoot}/foo/baz/file3.txt
{someRoot}/foo/abracadabra.txt
{someRoot}/foo/file2.txt
{someRoot}/aardvark.txt
{someRoot}/food.txt
{someRoot}/zebra.txt
您会注意到顺序。将此称为 order1。在每个阶段,目录都排在文件之前。 (注意: bar/file1.txt 位于 foo 之前,因此在全球范围内,目录并非都位于所有文件之前。)
如果我枚举这个目录树,然后递归枚举子目录,我会得到以下List<File>,顺序为order2。
{someRoot}/
{someRoot}/aardvark.txt
{someRoot}/bar/
{someRoot}/foo/
{someRoot}/food.txt
{someRoot}/zebra.txt
{someRoot}/bar/file1.txt
{someRoot}/foo/abracadabra.txt
{someRoot}/foo/baz/
{someRoot}/foo/file2.txt
{someRoot}/foo/baz/file3.txt
如果我创建简单的Comparator<File>:
Comparator<File> fc = new Comparator<File>(){
@Override public int compare(File o1, File o2) {
return o1.compareTo(o2);
}
};
然后我排序,我从字典排序中得到了这个排序(order3):
{someRoot}
{someRoot}/aardvark.txt
{someRoot}/bar
{someRoot}/bar/file1.txt
{someRoot}/foo
{someRoot}/food.txt
{someRoot}/foo/abracadabra.txt
{someRoot}/foo/baz
{someRoot}/foo/baz/file3.txt
{someRoot}/foo/file2.txt
{someRoot}/zebra.txt
但我不想要这种排序(有问题:注意food.txt 位于目录foo 及其子项之间),我想要order1。我怎样才能写一个比较器来得到我呢?
【问题讨论】:
-
将 food.txt 放在那个位置的规则是什么? barista.txt 会放在“/bar/file1.txt”和“/foo/”之间吗?
-
Order1 也称为“深度优先”。该短语可能有助于您的搜索。
-
在 order1 中,barista.txt 将放在它们之后。需要首先比较大多数特定目录。
-
@Kelly:我从未听说过深度优先比较器,只是深度优先搜索。
-
@Jason:它用于描述必须遍历树的递归解析器的行为,有点像你正在做的事情。有“深度优先”和“广度优先”之分。它们描述了在对等节点之前枚举子节点之间做出的选择,反之亦然。
标签: java file comparator