[topic] フォルダパス一覧のツリー構造への変換

(相対)フォルダのパスの一覧が与えられ、そのフォルダパスの一覧をツリー構造に変換してください。
フォルダパスの区切り文字は'\'文字を使用しています。

以下のような1行1パスのフォルダのパスがあった場合、
 abc\def
 abc\def\gh
 abc\def\ij
 abc\jk\lm
 de

イメージとして、以下のようなツリー構造を構築できればOKです。
 ROOT
 ┗abc
  ┗def
   ┗gh
   ┗ij
  ┗jk
   ┗lm
 ┗de

ツリーですのでルートがあります。上記のフォルダ一覧はルート以下にぶら下げてください。また、同じフォルダにぶら下がっているサブフォルダの名前は重複させてはいけません。

上記のような出力は結果の分かりやすさとしてあった方がいいですが、なければないで構いません。また、ASやJavaFXでグラフィカルな結果を表示するプログラムでも構いませんが、データ構造はちゃんと作ってください。

Posted feedbacks - Java

「データ構造を作成する」という条件に合うか微妙ですが、DefaultMutableTreeNodeを自分で操作してるので、いいよね。(なお、ノードはソートされません)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.tree.*;

class MeApp {
    public static void main(String[] args) throws Exception {
        final DefaultMutableTreeNode root = new DefaultMutableTreeNode("ROOT");
        final BufferedReader r = new BufferedReader(new FileReader(args[0]));
        try {
            String path;
            while ((path = r.readLine()) != null) {
                DefaultMutableTreeNode node = root;
                for (String name : path.split("\\\\")) {
                    node = getChild(node, name);
                }
            }
        } finally {
            r.close();
        }
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                final MeFrame frame = new MeFrame(root);
                frame.setDefaultCloseOperation(MeFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    private static DefaultMutableTreeNode getChild(DefaultMutableTreeNode parent, String name) {
        final Enumeration e = parent.children();
        while (e.hasMoreElements()) {
            final DefaultMutableTreeNode child = (DefaultMutableTreeNode)e.nextElement();
            if (child.getUserObject().equals(name)) {
                return child;
            }
        }
        final DefaultMutableTreeNode child = new DefaultMutableTreeNode(name);
        parent.add(child);
        return child;
    }
}

class MeFrame extends JFrame {
    public MeFrame(TreeNode root) {
        final JTree tree = new JTree(root);
        for (int i = 0; i < tree.getRowCount(); ++i) { // expand all
            tree.expandRow(i);
        }
        setContentPane(new JScrollPane(tree));
    }
}

Index

Feed

Other

Link

Pathtraq

loading...