2012-03-09 55 views
1

我有点卡在一个项目上.. 基本上,我得到一个目录来扫描通过某些过滤器的文件。多个键和值

命令文件包含带过滤的行(给定的过滤器名称存储在枚举文件中)指令。像这样的例子: 后缀%TXT EXEC%是

如果这一切,它会返回一个TXT(扩展)结束所有文件和可执行.. 到目前为止没有问题。

问题开始像这样一行: 后缀%TXT EXEC%YES(在同一行)在这种情况下,它应该返回所有以TXT或可执行结束文件..

我使用String.split(“%”)分割线并将其转换为带有键和值的映射,然后遍历每个键并检查枚举中的过滤器,并执行期望检查。

我有点卡在如何识别,当我有超过1每个行的过滤器。 我试着做一个HashMap的第一个过滤器作为关键,值是一个列表,其中包含所有其他(使用分裂(“”)分解过滤器.. 我不能依靠正在偶数或奇数索引,因为过滤器可能在其末尾有另一个%NOT(后缀%txt%NOT),它将返回所有不以txt结尾的文件...

任何帮助都会!感谢 感谢

回答

2

这个怎么样:创建一个Filter接口,并编写分析文件到基于文件的内容过滤器的功能你会碰到这样的:

interface Filter { 
    boolean passesFilter(File file); 
} 

class SuffixFilter implements Filter { 
    SuffixFilter(String suffix) { ... } 
    public boolean passesFilter(File file) { 
    // return true if file has the appropriate suffix 
    } 
} 

class ExecutableFilter implements Filter { 
    ... // filter that returns true if the file is executable 
} 

// now for the interesting part ... 
class NegationFilter implements Filter { 
    private final Filter subfilter; 
    NegationFilter(Filter subfilter) { 
    this.subfilter = subfilter; 
    } 

    public boolean passesFilter(File file) { 
    return !subfilter.passesFilter(file); 
    } 
} 

class AndFilter implements Filter { 
    private final Collection<Filter> subfilters; 
    AndFilter(Collection<Filter> subfilters) { 
    this.subfilters = subfilters; 
    } 

    public boolean passesFilter(File file) { 
    for (Filter subfilter : subfilters) { 
     if (!subfilter.passesFilter(file)) { 
     return false; 
     } 
    } 
    return true; 
    } 
} 

class OrFilter implements Filter { 
    private final Collection<Filter> subfilters; 
    OrFilter(Collection<Filter> subfilters) { 
    this.subfilters = subfilters; 
    } 

    public boolean passesFilter(File file) { 
    for (Filter subfilter : subfilters) { 
     if (subfilter.passesFilter(file)) { 
     return true; 
     } 
    } 
    return false; 
    } 
} 

有了这个地方,你只需要建立在同一行中的所有基本的过滤器,然后相邻单元获得OrFilter编在一起,同时在不同的行过滤器(或过滤与否)获得AndFilter版一起。这里有一个素描:

Filter readAndFilter(Iterable<String> fileLines) { 
    List<Filter> subfilters = new ArrayList<Filter>(); 
    for (String line : fileLines) { 
    subfilters.add(readOrFilter(line)); 
    } 
    return new AndFilter(subfilters); 
} 

Filter readOrFilter(String fileLine) { 
    List<Filter> subfilters = new ArrayList<Filter>(); 
    for (String oneFilter : fileLine.split(" ")) { 
    Filter filter = buildOneFilter(oneFilter); 
    subfilters.add(filter); 
    } 
    return new OrFilter(subfilters); 
} 

Filter buildOneFilter(String oneFilterClause) { 
    // parse as you were doing before 
} 

你会打电话readAndFilter上线从文件中读出,并返回给你总是一个Filter,你可以将文件传给它会告诉你他们是否通过过滤。 (注意:如果你愿意,你可以特殊处理我的readAndFilterreadOrFilter方法来检查它们要返回的列表是否长度为1,如果是这样,只需返回一个过滤器而不是一个AndOr它不会影响正确性,但它可能会使调试输出更容易阅读。)

+0

感谢您长时间的回答,我想我喜欢您尝试使用的方式,但我仍然有一个很少有不清楚的东西 我还不太确定如何实现它。我得到了一个txt文件,我可以为它们中的每一个创建一个相应的过滤器对象。但是从这里开始..如果找到了“(每行超过2个过滤器)”,则创建一个新的OrFilter对象。并在扫描所有行的最后,调用AndFilter对象? 并再次感谢,将试一试 – 2012-03-09 01:33:43

+0

编辑我的答案,勾勒出如何解析文件以生成过滤器。 – jacobm 2012-03-09 03:04:26

+0

谢谢!这主意听起来很不错。我会执行这个。 – 2012-03-09 12:21:20