Java 多个键和值

Java 多个键和值,java,oracle,arraylist,hashmap,Java,Oracle,Arraylist,Hashmap,我有点被一个项目困住了。。 基本上,我得到一个目录来扫描通过某些过滤器的文件 命令文件包含带有过滤(给定过滤器名称存储在枚举文件中)指令的行。例如: 后缀%txt 执行官%YES 如果仅此而已,它将返回所有以txt(扩展名)结尾且可执行的文件。。 到目前为止没有问题 问题从这样的行开始: 后缀%txt exec%YES(在同一行)在这种情况下,它应该返回所有以txt或executable结尾的文件 我使用String.split(“%”)拆分行,并将其放入一个带有键和值的映射中,然后迭代每个键,

我有点被一个项目困住了。。 基本上,我得到一个目录来扫描通过某些过滤器的文件

命令文件包含带有过滤(给定过滤器名称存储在枚举文件中)指令的行。例如: 后缀%txt 执行官%YES

如果仅此而已,它将返回所有以txt(扩展名)结尾且可执行的文件。。 到目前为止没有问题

问题从这样的行开始: 后缀%txt exec%YES(在同一行)在这种情况下,它应该返回所有以txt或executable结尾的文件

我使用String.split(“%”)拆分行,并将其放入一个带有键和值的映射中,然后迭代每个键,检查枚举中的过滤器,并执行所需检查

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

任何帮助都将不胜感激!
谢谢!

这样做怎么样:创建一个
过滤器
界面,并编写一个函数,根据文件内容将文件解析为单个过滤器。您可能会遇到以下情况:

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;
  }
}

您可以在从文件中读出的行上调用
readAndFilter
,您得到的总是一个
Filter
,您可以将文件传递给它,它会告诉您它们是否通过了过滤器。(注意:如果您愿意,您可以使用我的
readAndFilter
readOrFilter
方法的特殊情况来检查它们要返回的列表是否长度为1,如果是,只返回一个过滤器,而不是一个元素的
。这不会影响正确性,但可能会使调试输出成为一个问题。)有点容易阅读。)

谢谢你的长篇大论,我想我喜欢你尝试的方式,但我仍然有一些不清楚的地方,我仍然不太清楚如何实现它。我有一个txt文件,我可以为它们中的每一个创建一个对应的筛选器对象。但是从这里开始..如果找到“”(每行超过2个筛选器)创建一个新的OrFilter对象。在扫描完所有行后,调用AndFilter对象?再次感谢,我会给它一个尝试编辑我的答案来勾勒出如何解析文件以生成过滤器。谢谢!听起来是个好主意。我要实现这个。现在我正在考虑它,它不是有点不高效吗?因为每个信号在源目录(包括子目录)中的e文件中,您从命令文件创建所有筛选器对象?只是一个想法。我不明白为什么这种策略会使您比任何其他策略更多地解析规则定义。此外,我怀疑您将进行的磁盘和系统调用会使y解析过程中产生的额外成本(毫秒与纳秒或微秒)。
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
}