Java 集合查询:创建 mkdir 命令数组



我有一个String LinkedHashSet如下:

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

上述Set有12个String元素如下:

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 Array

输出String Array应包含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级别,然后通过迭代 Set 并借助String.split()方法来创建令牌,直到 baseDir1/subDir/ 个级别。

但是,当我再次必须升级时,我无法解决(baseDir2,baseDir3等)

我怎样才能做到这一点?

感谢您的阅读!

你需要使用 mkdirs 而不是 mkdir:

http://docs.oracle.com/javase/1.4.2/docs/api/java/io/File.html#mkdirs()

这将起作用,

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,所以添加的第一个路径将是Pathroot目录,然后是该目录的每个子目录。您也可以使用TreeSet

它打印

mkdir root
mkdir rootdir1
mkdir rootdir1dir2
mkdir rootdir1dir2dir3
mkdir rootdir1dir2dir3dir4
mkdir rootdir1dir2dir3dir4dir5
mkdir rootdir1dir2dir3dir4dir5baseDir1
mkdir rootdir1dir2dir3dir4dir5baseDir1subDir
mkdir rootdir1dir2dir3dir4dir5baseDir2
mkdir rootdir1dir2dir3dir4dir5baseDir2subDir
mkdir rootdir1dir2dir3dir4dir5baseDir3
mkdir rootdir1dir2dir3dir4dir5baseDir3subDir
mkdir rootdir1dir2dir3dir4dir5baseDir4
mkdir rootdir1dir2dir3dir4dir5baseDir4subDir
mkdir rootdir1dir2dir3dir4dir5baseDir5
mkdir rootdir1dir2dir3dir4dir5baseDir5subDir
mkdir rootdir1dir2dir3dir4dir5baseDir6
mkdir rootdir1dir2dir3dir4dir5baseDir6subDir

您可以随时根据需要订购它们。 Path也可能有一个内部排序逻辑。

如果你的意思是mkdir unix命令,那么你可以作弊并使用mkdir -p,它在此过程中创建了必要的父目录。

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

等。 或者只是使用 File.mkdirs() 在 Java 中创建目录,它执行相同的操作。

为了回答实际问题,我将使用中间结构,例如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

最新更新