インデントに基づいて特定のファイルのパスを作成したいと思います。リポジトリ内のプロジェクトの構造を返すコマンドがあります。以下のように
Requirement
abc.doc
Software
Code
File
aaa.c
bbb.c
aaa.cのパスを\Software\ Code\Fileとして取得できるかどうか知りたいです。これを行う方法についていくつかのアイデアを教えていただければ非常に役立ちます。
インデントに基づいて特定のファイルのパスを作成したいと思います。リポジトリ内のプロジェクトの構造を返すコマンドがあります。以下のように
Requirement
abc.doc
Software
Code
File
aaa.c
bbb.c
aaa.cのパスを\Software\ Code\Fileとして取得できるかどうか知りたいです。これを行う方法についていくつかのアイデアを教えていただければ非常に役立ちます。
<インデント サイズ、そのインデントを持つ最後のファイル> のマップを保持します。処理された行ごとに、(現在の行のインデント - 1) を持つエントリをマップで検索します。それが現在のファイルの親です。
フォルダーからファイルを明確にするための規則が必要になることに注意してください。すべてのリーフ ノード (子を持たないノード) がファイルであると仮定することもできますが、その場合、空のフォルダーを表す方法はありません。
すべてのリーフ ノードがファイルであると想定するソリューション:
final Map<Integer, FileDesc> history = new HashMap<>();
final Set<File> files = new HashSet<>();
history.put(-1, new FileDesc(basePath, false));
for (String line : inputLines) {
final int indent = indentSize(line);
final String fileName = fileName(line);
final FileDesc
parent = history.get(indent-1),
previous = history.get(indent),
current = new FileDesc(new File(parent.f, fileName), true);
parent.isFile = false;
if (previous != null && previous.isFile) files.add(previous.f);
history.put(indent, current);
}
for (FileDesc desc : history.values())
if (desc.isFile) files.add(desc.f);
class FileDesc {
final File f;
boolean isFile;
FileDesc(File f, boolean isFile) { this.f = f; this.isFile = isFile; }
}