简体   繁体   English

文件树。 可视化

[英]File Tree. Visualization

I beg you for help.我求你帮忙。 This is my task.这是我的任务。

File Tree Description文件树描述

Build a String representation of directory hierarchy under a given path在给定路径下构建目录层次结构的字符串表示

Details细节

Implement tree method in FileTreeImpl class.在 FileTreeImpl class 中实现树方法。

Input parameter is a path.输入参数是路径。

If a given path does not exist, return an empty Optional.如果给定路径不存在,则返回一个空的 Optional。

If a given path refers to a file, return a String with its name and size like this:如果给定的路径引用了一个文件,则返回一个带有其名称和大小的字符串,如下所示:

some-file.txt 128 bytes 

IF a given path refers to a directory, return a String with its name, total size and its full hierarchy:如果给定的路径指向一个目录,则返回一个带有名称、总大小和完整层次结构的字符串:

some-dir 100 bytes
├─ some-inner-dir 50 bytes
│  ├─ some-file.txt 20 bytes    
│  └─ some-other-file.txt 30 bytes
└─ some-one-more-file.txt 50 bytes

Use pseudo graphic symbols to format output.使用伪图形符号格式化 output。 Compute directory size as a sum of all its contents.将目录大小计算为其所有内容的总和。

Sort content in following way: directories go first, directories and files are sorted in lexicographic order (case-insensitive).按以下方式对内容进行排序:目录 go 首先,目录和文件按字典顺序排序(不区分大小写)。

This is my implementation.这是我的实现。

import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class FileTreeImpl implements FileTree {

    @Override
    public Optional<String> tree(Path path) {
        File file = new File(String.valueOf(path));
        if ( !file.exists()) return Optional.empty();
        if ( file.isFile()) {
            return Optional.of(file.getName() + " " + file.length() + " bytes");
        }
        if (file.isDirectory()) {
            return Optional.of(directoryTree(file, 0, false));
        }
        return Optional.empty();
    }
    private String directoryTree(File folder, int depth, boolean lastFolder) {
        String directory = folder.getName() + " " + folderSize(folder);
        if (depth != 0) directory = ((!lastFolder) ? "├─ " : "└─ ") + directory;
        File[] files = folder.listFiles();
        int count = files.length;
        files = sortFiles(files);
        for (int i = 0; i < count; i++) {
            directory += "\n";
            if (depth != 0) directory += "│  ";
            if (files[i].isFile()) {
                directory += (lastFolder ? "   " : "│  ") + (i + 1 == count ? "└" : "├") + "─ " +
                        files[i].getName() + " " + files[i].length() + " bytes";
            } else {
                directory += directoryTree(files[i], depth + 1, i + 1 == numberOfFolders(files));
            }
        }
        System.out.println(directory);
        return directory;
    }
    private long getFolderSize(File folder) {
        long size = 0;
        File[] files = folder.listFiles();

        int count = files.length;

        for (int i = 0; i < count; i++) {
            if (files[i].isFile()) {
                size += files[i].length();
            } else {
                size += getFolderSize(files[i]);
            }
        }
        return size;
    }
    private String folderSize(File folder) {
        return getFolderSize(folder) + " bytes";
    }
    private File[] sortFiles(File[] folder) {
      
        Arrays.sort(folder);
        List<File> sorted = new ArrayList<>();
    
        for (int i = 0; i < folder.length; i++) {
            if (folder[i].isDirectory()) sorted.add(folder[i]);
        }
        
        for (int i = 0; i < folder.length; i++) {
            if (folder[i].isFile()) sorted.add(folder[i]);
        }
        return sorted.toArray(new File[sorted.size()]);
    }
    private int numberOfFolders(File[] files) {
        int folders = 0;
        for (File file : files)
            if (file.isDirectory()) folders++;
        return folders;
    }
}

code of tests you can see here: https://github.com/npogoncuk/file-tree你可以在这里看到的测试代码: https://github.com/npogoncuk/file-tree

expected and actual:预期和实际:

https://i.stack.imgur.com/N8ftB.png

Please, help me change the code or, please, give me a piece of advice about new algorithm.请帮我更改代码,或者请给我一些关于新算法的建议。

Here is the solution.这是解决方案。

import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class FileTreeImpl implements FileTree {

    @Override
    public Optional<String> tree(Path path) {
        File file = new File(String.valueOf(path));
        if ( !file.exists()) return Optional.empty();
        if ( file.isFile()) {
            return Optional.of(file.getName() + " " + file.length() + " bytes");
        }
        if (file.isDirectory()) {
           
            return Optional.of(directoryTree(file, new ArrayList<>()));
        }
        return Optional.empty();
    }
    private String directoryTree(File folder, List<Boolean> lastFolders) {
        String directory = "";
        if (lastFolders.size() != 0)
            directory += (!(lastFolders.get(lastFolders.size() -1 )) ? "├─ " : "└─ ");
        directory += folder.getName() + " " + folderSize(folder);

        File[] files = folder.listFiles();
        int count = files.length;
        files = sortFiles(files);
        for (int i = 0; i < count; i++) {
            directory += "\n";
            for (Boolean lastFolder : lastFolders) {
                if (lastFolder) {
                    directory += "   ";
                } else {
                    directory += "│  ";
                }
            }
            if (files[i].isFile()) {
                directory += (i + 1 == count ? "└" : "├") + "─ " +
                        files[i].getName() + " " + files[i].length() + " bytes";
            } else {
                ArrayList<Boolean> list = new ArrayList<>(lastFolders);
                list.add(i+1 == count);
                directory += directoryTree(files[i], list);
            }
        }
        return directory;
    }
    private long getFolderSize(File folder) {
        long size = 0;
        File[] files = folder.listFiles();

        int count = files.length;

        for (int i = 0; i < count; i++) {
            if (files[i].isFile()) {
                size += files[i].length();
            } else {
                size += getFolderSize(files[i]);
            }
        }
        return size;
    }
    private String folderSize(File folder) {
        return getFolderSize(folder) + " bytes";
    }
    private File[] sortFiles(File[] folder) {

        Arrays.sort(folder);
        List<File> sorted = new ArrayList<>();

        for (int i = 0; i < folder.length; i++) {
            if (folder[i].isDirectory()) sorted.add(folder[i]);
        }

        for (int i = 0; i < folder.length; i++) {
            if (folder[i].isFile()) sorted.add(folder[i]);
        }
        return sorted.toArray(new File[sorted.size()]);
    }
}

Example of output output 示例

test3 0 bytes
├─ a 0 bytes
│  ├─ aa 0 bytes
│  │  ├─ a.txt 0 bytes
│  │  ├─ b.txt 0 bytes
│  │  ├─ c.txt 0 bytes
│  │  └─ d.txt 0 bytes
│  └─ BA 0 bytes
│     ├─ A.txt 0 bytes
│     ├─ b.txt 0 bytes
│     ├─ C.txt 0 bytes
│     └─ d.txt 0 bytes
├─ b 0 bytes
│  ├─ AB 0 bytes
│  │  ├─ a.txt 0 bytes
│  │  ├─ b.txt 0 bytes
│  │  ├─ c.txt 0 bytes
│  │  └─ d.txt 0 bytes
│  └─ bb 0 bytes
│     ├─ A.txt 0 bytes
│     ├─ b.txt 0 bytes
│     ├─ C.txt 0 bytes
│     └─ d.txt 0 bytes
├─ c 0 bytes
│  ├─ aa 0 bytes
│  │  ├─ a.txt 0 bytes
│  │  ├─ b.txt 0 bytes
│  │  ├─ c.txt 0 bytes
│  │  └─ d.txt 0 bytes
│  ├─ BA 0 bytes
│  │  ├─ A.txt 0 bytes
│  │  ├─ b.txt 0 bytes
│  │  ├─ C.txt 0 bytes
│  │  └─ d.txt 0 bytes
│  ├─ a.txt 0 bytes
│  ├─ b.txt 0 bytes
│  ├─ c.txt 0 bytes
│  └─ d.txt 0 bytes
└─ d 0 bytes
   ├─ aa 0 bytes
   │  ├─ a.txt 0 bytes
   │  ├─ b.txt 0 bytes
   │  ├─ c.txt 0 bytes
   │  └─ d.txt 0 bytes
   └─ bb 0 bytes
      ├─ A.txt 0 bytes
      ├─ b.txt 0 bytes
      ├─ C.txt 0 bytes
      └─ d.txt 0 bytes

slightly modified the code above稍微修改了上面的代码

public class FileTreeImpl implements FileTree {
public Optional<String> tree(Path path) {
    File file = new File(String.valueOf(path));
    if ( !file.exists()) return Optional.empty();
    if ( file.isFile()) {
        return Optional.of(file.getName() + " " + file.length() + " bytes");
    }
    if (file.isDirectory()) {

        return Optional.of(directoryTree(file, new ArrayList<>()));
    }
    return Optional.empty();
}
private String directoryTree(File folder, List<Boolean> lastFolders) {
    String directory = "";
    if (lastFolders.size() != 0)
        directory += (!(lastFolders.get(lastFolders.size() -1 )) ? "├─ " : "└─ ");
    directory += folder.getName() + " " + folderSize(folder);

    File[] files = folder.listFiles();
    int count = files.length;
    files = sortFiles(files);
    for (int i = 0; i < count; i++) {
        directory += "\n";
        for (Boolean lastFolder : lastFolders) {
            if (lastFolder) {
                directory += "   ";
            } else {
                directory += "│  ";
            }
        }
        if (files[i].isFile()) {
            directory += (i + 1 == count ? "└" : "├") + "─ " +
                    files[i].getName() + " " + files[i].length() + " bytes";
        } else {
            ArrayList<Boolean> list = new ArrayList<>(lastFolders);
            list.add(i+1 == count);
            directory += directoryTree(files[i], list);
        }
    }
    return directory;
}
private long getFolderSize(File folder) {
    long size = 0;
    File[] files = folder.listFiles();

    int count = files.length;

    for (int i = 0; i < count; i++) {
        if (files[i].isFile()) {
            size += files[i].length();
        } else {
            size += getFolderSize(files[i]);
        }
    }
    return size;
}
private String folderSize(File folder) {
    return getFolderSize(folder) + " bytes";
}
private File[] sortFiles(File[] folder) {
    List<File> file = new ArrayList<>();
    List<File> directory = new ArrayList<>();
    for (int i = 0; i < folder.length; i++) {
        if (folder[i].isDirectory())
            file.add(folder[i]);
    }
    file.sort((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName()));

    for (int i = 0; i < folder.length; i++) {
        if (folder[i].isFile())
            directory.add(folder[i]);
    }
    directory.sort((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName()));
    file.addAll(directory);

    return file.toArray(new File[file.size()]);
}

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM