Я в тупике ... Допустим, у меня есть это дерево каталогов:
{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 .Как я могу написать Компаратор, чтобы получить это?