有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从字符串路径列表中获取子元素

如果我有一个字符串路径列表

Mammal/

Mammal/Pet/

Mammal/Pet/Dog/

Mammal/Pet/Cat/

Bird/

Bird/Blah/

Bird/Blah/Parrot/

Bird/Blah/Parrot/Feather/

而我只想要孩子的大部分元素

Mammal/Pet/Dog/

Mammal/Pet/Cat/

Bird/Blah/Parrot/Feather/

我怎样才能比现在做得更好呢

我目前的代码写得不是很好,但它确实有效

List<String> paths = ...;
List<String> children = new ArrayList<String>();
if(paths.size()==1){children.add(paths.get(0));}
for(int i=1; i < paths.size(); i++){
    //Found a local maximum in number of "/"'s
    if(paths.get(i).split("/").length <= paths.get(i-1).split("/").length){
        children.add(paths.get(i-1));
    }
    else if(i==paths.size()-1){
        children.add(paths.get(i));
    }
}

共 (1) 个答案

  1. # 1 楼答案

    您可以使用文件。walkFileTree(),同时添加“叶”目录。参数是起始路径和SimpleFileVisitor实现。访问者只需检查当前目录中的文件,如果文件本身都不是目录,则该目录将添加到路径集

    Path start = Paths.get(...); // e.g. directory.getCanonicalPath()
    Set<Path> leafDirectories = new HashSet<>();
    Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
            File[] subdirectories = dir.toFile().listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    return pathname.isDirectory();
                }
            });
        
            if (subdirectories.length == 0)
                leafDirectories.add(dir);
        
            return FileVisitResult.CONTINUE;
        }
    });
    // print leaf directories
    leafDirectories.stream().forEach(dir -> System.out.println(dir));