请问如果给出一系列文件路径,然后将其进行树结构归类?

开发时遇到一个问题,就是需要给出一系列文件路径,这些路径是字符串,以 / 分割,并不是直接读取目录获取,比如:

a/b/c/d/file.txt
a/b/c/e/file1.txt
a/file2.txt
g/ccc.txt
h/jjj.txt
khk.txt

然后现在要归类为树结构,归类后这样:

a
|--b
   |--c
      |--d
         |--file.txt
      |--e
         |--file1.txt
|--file2.txt
g
|--ccc.txt
h
|--jjj.txt
khk.txt

脑袋晕了,思维完全混乱,谁能帮帮忙?

共 4 个回复


stevewang

树结构可以用链表container/list或者直接用slice嵌套实现。
有什么问题呢?

# 0

ylqjgm

@stevewang
问题就是我把流程搞混乱了,思路乱了。。。
我现在不明白应该怎样来走这个流程,没思路。。。

# 1

stevewang

package main

import (
    "strings"
)

type File struct {
    name string
}

type Directory struct {
    name  string
    dirs  []*Directory
    files []*File
}

var Root = Directory{
    name: "/",
}

func (d *Directory) FindDir(name string) *Directory {
    for i := 0; i < len(d.dirs); i++ {
        if d.dirs[i].name == name {
            return d.dirs[i]
        }
    }
    return nil
}

func (d *Directory) MakeDir(name string) *Directory {
    dir := &Directory{
        name: name,
    }
    d.dirs = append(d.dirs, dir)
    return dir
}

func (d *Directory) FindFile(name string) *File {
    for i := 0; i < len(d.files); i++ {
        if d.files[i].name == name {
            return d.files[i];
        }
    }
    return nil
}

func (d *Directory) MakeFile(name string) *File {
    file := &File{
        name: name,
    }
    d.files = append(d.files, file)
    return file
}

func Build(path []string) {
    parent := &Root
    for i := 0; i < len(path)-1; i++ {
        dir := parent.FindDir(path[i])
        if dir == nil {
            dir = parent.MakeDir(path[i])
        }
        parent = dir
    }
    file := path[len(path)-1]
    if parent.FindFile(file) == nil {
        parent.MakeFile(file)
    }
}

func main() {
    paths := []string{
        "a/b/c/d/file.txt",
        "a/b/c/e/file1.txt",
        "a/file2.txt",
        "g/ccc.txt",
        "h/jjj.txt",
        "khk.txt",
    }
    for i := 0; i < len(paths); i++ {
        path := strings.Split(paths[i], "/")
        Build(path)
    }
}
# 2

ylqjgm

@stevewang
非常非常感谢,之前思路完全混乱。。。

# 3