0

私は以下LinkedHashSetのようなものを持ってStringいます:

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

以下のように、上記の12Stringの要素があります。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メソッドの出力が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/

レベルに到達してから、セットを反復処理し、トークンを作成するメソッドの助けを借りて、 dir51 レベルに進むことができます。baseDir1/subDir/String.split()

しかし、再びレベルアップする必要がある場合 (baseDir2、baseDir3 など) に取り組むことができません。

どうすればこれを達成できますか?

読んでくれてありがとう!

4

3 に答える 3

1

mkdir の代わりに mkdirs を使用する必要があります。

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

于 2013-09-06T14:33:44.077 に答える
0

mkdirUNIXコマンドを意味する場合は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
于 2013-09-06T14:31:48.433 に答える