Иерархия узлов из списка путей каталога

Привет, я пытаюсь построить иерархию узлов на основе структуры каталогов:

/first/ /first/second /first/third /first/third/forth /first/third/fifth /first/sixth /first/sixth/seventh /first/eighth /first/ninth 

Я пытаюсь получить иерархию узлов, подобную этой:

 first second third forth fifth sixth seventh eighth ninth 

Я использую Kotlin для этого, я все еще относительно новичок в Java, и Котлин так несут меня.

Примечание. Я использую FileTreeWalk для получения каталогов

 fun getDirs(directoryName: String): MutableList<String> { val ret = mutableListOf<String>() File(directoryName).walk().forEach { if (it.isDirectory) { ret.add(it.toString()) } } return ret } 

Прямо сейчас все, что у меня есть, это (генерирует плоскую иерархию):

 private fun nodesFromPathList(dirPaths: MutableList<String>) : Tree.Node { val ret = Tree.Node("root") for (dir in dirPaths) { ret.add(Tree.Node(dir)) } return ret } 

Есть идеи?

Я решил поместить все узлы в карту и соединить узлы вместе.

  /** * Creates a node hierarchy from list of paths */ private fun nodesFromPathList(dirPaths: MutableList<String>) : Tree.Node? { var ret : Tree.Node? = null val nodeMap = mutableMapOf<String, Tree.Node>() // Add a node for each directory path and put it into a map for (dir in dirPaths) { val newNode = Tree.Node(nodeName(dir), skin) if (ret == null) ret = newNode nodeMap.put(dir, newNode) } // Go through each one and add the child nodeMap.forEach { val parent = parentPath(it.key) try { nodeMap[parent]!!.add(it.value) } catch (e: NullPointerException) { println("Parent not found") } } return ret } /** * Returns current path * "D:\dir\to\apath" ==> "apath" */ fun nodeName(path: String): String { return path.split("\\").last() } /** * Returns the parent path * D:\dir\to\apath ==> D:\dir\to */ fun parentPath(path: String): String { val split = path.trim('\\').split("\\") var ret = "" for (i in 0..split.size-2) { ret += split[i] + "\\" } return ret.trim('\\') } 

Я помещаю путь в ключ, а узел дерева – в значение. Итерации через карту и связанные дети на основе родителя. Пример карты:

 [D:\android\assets=Tree$Node@56eb1af5, D:\android\assets\Assets\abc=Tree$Node@48e3456d, D:\android\assets\Assets\abc\bcd=Tree$Node@3e532818, D:\android\assets\Assets\abc\cde=Tree$Node@16b07083] 

Я бы нашел родителя из ключа (разделив строку), а затем установил родительский элемент.

Intereting Posts