2013-09-06 3 views
0

У меня есть LinkedHashSet из String, как показано ниже:Java: создание массива MKDIR команды

Set<String> dirSet = new LinkedHashSet<String>(); 

Есть 12 String элементы выше Set, как показано ниже:

root/dir1/dir2/dir3/dir4/dir5/baseDir1/ 
root/dir1/dir2/dir3/dir4/dir5/baseDir1/subDir/ 
root/dir1/dir2/dir3/dir4/dir5/baseDir2/ 
root/dir1/dir2/dir3/dir4/dir5/baseDir2/subDir/ 
root/dir1/dir2/dir3/dir4/dir5/baseDir3/ 
root/dir1/dir2/dir3/dir4/dir5/baseDir3/subDir/ 
root/dir1/dir2/dir3/dir4/dir5/baseDir4/ 
root/dir1/dir2/dir3/dir4/dir5/baseDir4/subDir/ 
root/dir1/dir2/dir3/dir4/dir5/baseDir5/ 
root/dir1/dir2/dir3/dir4/dir5/baseDir5/subDir/ 
root/dir1/dir2/dir3/dir4/dir5/baseDir6/ 
root/dir1/dir2/dir3/dir4/dir5/baseDir6/subDir/ 

Я хочу написать метод для итерации через выше Set таким образом, что вывод метода представляет собой StringArray, содержащий команды для создания вышеуказанной структуры каталогов.

Выход StringArray должен содержать String элементов, как показано ниже:

mkdir root/ 
mkdir root/dir1/ 
mkdir root/dir1/dir2/ 
mkdir root/dir1/dir2/dir3/ 
mkdir root/dir1/dir2/dir3/dir4/ 
mkdir root/dir1/dir2/dir3/dir4/dir5/ 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir1/ 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir1/subDir/ 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir2/ 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir2/subDir/ 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir3/ 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir3/subDir/ 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir4/ 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir4/subDir/ 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir5/ 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir5/subDir/ 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir6/ 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir6/subDir/ 

Я могу достичь dir5 уровня, а затем перейти на один уровень, т.е. до baseDir1/subDir/ перебирая Комплекс и с помощью от String.split() метода для создания жетоны.

Однако, я не в состоянии решить, когда я снова должен пойти на уровень вверх (baseDir2, baseDir3 и т.д.)

Как я могу добиться этого?

Спасибо за чтение!

+0

Используйте класс 'java.nio.file.Path' при работе с файловыми путями. –

ответ

0

Это будет работать,

List<String> list = Arrays.asList(
"root/dir1/dir2/dir3/dir4/dir5/baseDir1/", 
"root/dir1/dir2/dir3/dir4/dir5/baseDir1/subDir/", 
"root/dir1/dir2/dir3/dir4/dir5/baseDir2/", 
"root/dir1/dir2/dir3/dir4/dir5/baseDir2/subDir/", 
"root/dir1/dir2/dir3/dir4/dir5/baseDir3/", 
"root/dir1/dir2/dir3/dir4/dir5/baseDir3/subDir/", 
"root/dir1/dir2/dir3/dir4/dir5/baseDir4/", 
"root/dir1/dir2/dir3/dir4/dir5/baseDir4/subDir/", 
"root/dir1/dir2/dir3/dir4/dir5/baseDir5/", 
"root/dir1/dir2/dir3/dir4/dir5/baseDir5/subDir/", 
"root/dir1/dir2/dir3/dir4/dir5/baseDir6/", 
"root/dir1/dir2/dir3/dir4/dir5/baseDir6/subDir/"); 

Set<String> dirSet = new LinkedHashSet<>(list); 
Set<Path> allDirs = new LinkedHashSet<>(); 
for (String file : dirSet) { 
    recur(allDirs, Paths.get(file)); 
} 

for (Path path : allDirs) { 
    System.out.println("mkdir " + path); 
} 

... 

public static void recur(Set<Path> paths, Path path) { 
    if (path == null) 
     return; 
    recur(paths, path.getParent()); 
    paths.add(path); 
} 

Используйте рекурсивное метод. Возвращайтесь, если Path передан null, в противном случае повторяется его родитель. Затем добавьте путь.

Поскольку мы используем LinkedHashSet, который сохраняет заказ, первым добавленным путём будет каталог rootPath, а затем каждый ребенок этого. Вы также можете использовать TreeSet.

Он печатает

mkdir root 
mkdir root\dir1 
mkdir root\dir1\dir2 
mkdir root\dir1\dir2\dir3 
mkdir root\dir1\dir2\dir3\dir4 
mkdir root\dir1\dir2\dir3\dir4\dir5 
mkdir root\dir1\dir2\dir3\dir4\dir5\baseDir1 
mkdir root\dir1\dir2\dir3\dir4\dir5\baseDir1\subDir 
mkdir root\dir1\dir2\dir3\dir4\dir5\baseDir2 
mkdir root\dir1\dir2\dir3\dir4\dir5\baseDir2\subDir 
mkdir root\dir1\dir2\dir3\dir4\dir5\baseDir3 
mkdir root\dir1\dir2\dir3\dir4\dir5\baseDir3\subDir 
mkdir root\dir1\dir2\dir3\dir4\dir5\baseDir4 
mkdir root\dir1\dir2\dir3\dir4\dir5\baseDir4\subDir 
mkdir root\dir1\dir2\dir3\dir4\dir5\baseDir5 
mkdir root\dir1\dir2\dir3\dir4\dir5\baseDir5\subDir 
mkdir root\dir1\dir2\dir3\dir4\dir5\baseDir6 
mkdir root\dir1\dir2\dir3\dir4\dir5\baseDir6\subDir 

Вы всегда можете заказать их, как вы хотите. Path может иметь внутреннюю логику заказа.

+1

Почему вся эта суета, когда есть [File.mkdirs()] (http://docs.oracle.com/javase/6/docs/api/java/io/File.html#mkdirs()) вызов? – ppeterka

+0

@ ppeterka66 Я не знаю, но ОП объяснил в комментарии к другому ответу, что его требование было немного сложнее, чем это. Возможно, это просто печать. –

0

Если вы имеете в виду mkdir unix-команды, тогда вы можете обмануть и использовать mkdir -p, который создает необходимые родительские каталоги на этом пути.

mkdir -p root/dir1/dir2/dir3/dir4/dir5/baseDir1/ 
mkdir -p root/dir1/dir2/dir3/dir4/dir5/baseDir1/subDir/ 

и т.д. Или просто создать каталоги в Java с помощью File.mkdirs(), который делает то же самое.

Чтобы ответить на этот актуальный вопрос, я хотел бы использовать промежуточную структуру, такую ​​как TreeSet

TreeSet<String> mkdirCmds = new TreeSet<String>(); 
for(String origPath : dirSet) { 
    if(origPath.endsWith("/")) { 
    // strip trailing slash if there is one 
    origPath = origPath.substring(0, origPath.length() - 1); 
    } 
    mkdirCmds.add("mkdir " + origPath); 
    int lastSlash = origPath.lastIndexOf('/'); 
    while(lastSlash >= 0) { 
    mkdirCmds.add("mkdir " + origPath.substring(0, lastSlash)); 
    lastSlash = origPath.lastIndexOf('/', lastSlash - 1); 
    } 
} 
String[] result = mkdirCmds.toArray(new String[0]); 

Это даст вам список mkdir команд для всех исходных путей плюс их родители, бабушки и дедушки, и т.д. с нет дубликатов (потому что mkdirCmds - это набор) и с родителями, перечисленными перед их детьми (потому что TreeSet<String> лексикографически отсортирован).

Для вашего первоначального входа он будет производить

mkdir root 
mkdir root/dir1 
mkdir root/dir1/dir2 
mkdir root/dir1/dir2/dir3 
mkdir root/dir1/dir2/dir3/dir4 
mkdir root/dir1/dir2/dir3/dir4/dir5 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir1 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir1/subDir 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir2 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir2/subDir 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir3 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir3/subDir 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir4 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir4/subDir 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir5 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir5/subDir 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir6 
mkdir root/dir1/dir2/dir3/dir4/dir5/baseDir6/subDir 
+0

Я обобщил актуальную проблему, с которой я столкнулся. Итак, я хочу точно, что я описал в своем вопросе. Как получить второй набор строк в массиве, учитывая первый набор строк в HashSet ... – Nik

+0

@NikunjChauhan Я добавил возможное решение, используя TreeSet –

Смежные вопросы