将文件夹和文件过滤到树中(复合模式)

时间:2015-02-03 00:56:56

标签: java sorting design-patterns reflection tree

我无法创建排序方法将文件夹和文件放入树结构中。我正在使用复合模式,我有Leaf(文件)和节点(目录)。我还有一份参赛作品清单。我无法弄清楚如何对它们进行排序并创建树形结构 这是输出的例子

org/apache/logging/log4j/core/osgi/is directory !
org/apache/logging/log4j/core/pattern/is directory !
org/apache/logging/log4j/core/selector/is directory !
org/apache/logging/log4j/core/tools/is directory !
org/apache/logging/log4j/core/util/is directory !
Log4j-config.xsd
Log4j-events.dtd
Log4j-events.xsd
Log4j-levels.xsd
META-INF/LICENSE
META-INF/log4j-provider.properties
META-INF/NOTICE
META-INF/org/apache/logging/log4j/core/config/plugins/Log4j2Plugins.dat
META-INF/services/javax.annotation.processing.Processor
org/apache/logging/log4j/core/AbstractLifeCycle.class
org/apache/logging/log4j/core/AbstractLogEvent.class
org/apache/logging/log4j/core/appender/AbstractAppender.class

我可以确定在哪个目录中只按路径放入条目。我不知道如何正确地做到这一点 我有两个类(复合模式)EntryFile和EntryFolder它们都扩展了Entry,EntryFolder依次有添加Entry对象的方法。
请建议如何做到这一点。我的大脑不想工作 Thx提前。

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,它是"我怎样才能从表示目录的字符串列表转到表示文件系统的树结构"。

如果不提供所有代码,我认为您的解决方案的结构应如下所示:

class EntryFolder implements Entry {

    public void addEntryFromPath(String path) {
        addEntryFromPathComponents(Arrays.toList(path.split("/"));
    }

    private void addEntryFromPathComponents(List<String> pathComponents) {
        if (pathComponents.isEmpty()) {
            return;
        } else if (pathComponents.size() == 1) {
            addFileEntry(pathComponents.get());
        } else {
            DirectoryEntry child = getDirectoryEntry(pathComponents.get(0));
            if (child == null) {
                child = addDirectoryEntry(childName);
            }
            child.addEntryFromPathComponents(path.subList(0, path.size()));
        }
    }
}

然后将其与entries声明为List<String>一起使用,您将使用以下内容:

FolderEntry root = entries.stream()
    .collect(EntryFolder::new, EntryFolder::addEntryFromPath);