2017-05-17 2 views
1

私はn個のパスのリストを持っており、それらの中から階層(オブジェクトを含むツリー構造)を作成したいと思います。Javaのパスを階層にソート

など。 パス:

/src/main/java/tools/mockfile/generator/data/RecordPart.java 
/src/main/java/tools/mockfile/generator/Analyzer.java 
/src/main/java/tools/mockfile/test/Menu.java 
... 

小さな階層:

mockfile 
    ├── generator 
    │ ├── data 
    │ │ └── RecordPart.java 
    │ └── Analyzer.java 
    └── test 
     ├── Menu.java 
     └── ... 

は、階層へのパスを並べ替えるために私を助けることができる任意のライブラリや方法はありますか? または、文字列を分割してすべてのパートを比較し、独自の階層を構築する唯一の方法はありますか?

+0

階層を印刷するという意味ですか?または、オブジェクトを使って何らかの木構造を作成しますか? –

+0

Jepは一種のツリー構造を作成することを意味します – Drextor

+0

java.io.Fileクラスを使用してこれを行うことができるはずです:https://docs.oracle.com/javase/7/docs/api/java/io/File .html –

答えて

1

ネストされたMapをツリーとして使用して、ストリングを他のネストされたマップにマッピングすることができます。あなたはちょうど種類の情報を取得するヘルパークラスを定義することができます。

class Tree extends HashMap<String, Tree> {} 
Tree tree = new Tree(); 

この方法では、ツリーはすでに必要なすべての便利な機能が付属しています。すると、ちょうどパスとそのセグメントを反復し、必要に応じて新しいブランチを作成するためにcomputeIfAbsentを使用します。

List<String> paths = Arrays.asList(
     "/src/main/java/tools/mockfile/generator/data/RecordPart.java", 
     "/src/main/java/tools/mockfile/generator/Analyzer.java", 
     "/src/main/java/tools/mockfile/test/Menu.java"); 

for (String path : paths) { 
    Tree node = tree; 
    for (String segment : path.split("/")) { 
     node = node.computeIfAbsent(segment, s -> new Tree()); 
    } 
} 

その後、treeはこのようになります(インデント鉱山;ルートが空の文字列であることに注意):

{={src={main={java={tools={mockfile={test={Menu.java={}}, 
             generator={data={RecordPart.java={}}, 
               Analyzer.java={}}}}}}}}} 

別の空白の代わりにnullをファイル(葉)に入れてください。Tree

+0

ありがとう、素晴らしい作品 – Drextor

0

ツリー構造を作成して操作したい場合、アドホックライブラリはJgraphtです。