好的,我确定我不会以最有效的方式进行此操作,并且正在寻求有关如何更有效地执行此操作的帮助...


config.txt文件包含键/值对,其中key =测试名称,value =是否执行测试
解析配置文件并创建要运行的测试列表
运行那些测试


这是我目前正在做的事情


通过传递给我的配置文件上的辅助函数parseConfig和BufferedReader来创建ArrayList。 parseConfig返回一个TreeSet,我在ArrayList的构造方法中使用它
parseConfig遍历配置文件中的文本行。如果值指示要执行测试,则将测试名称添加到TreeSet中。返回TreeSet。
使用增强的for循环遍历ArrayList。增强的for循环的主体基本上是一个长的if / else语句... if key.equals(“ thisTest”),执行thisTest,否则,如果key.equals(thatTest),执行thatTest ... etc


我真的不喜欢那最后一部分。它运作良好,但显得笨拙且效率低下。由于我的ArrayList是使用TreeSet构造的,因此按排序顺序。我想使用一种更优雅和确定性的方法将我的密钥映射到要执行的测试。谁能帮我?

最佳答案

我会做其他事情,因为您只需要测试此列表的条目即可。

我将逐行处理并在其上应用一个正则表达式,从我看到的结果来看,这将非常简单,只有两个组并且正向查找,这样我就可以只提取所有匹配的行并从中创建一个ArrayList。这些,然后迭代ArrayList并测试每个方法。如果您可以提供有关文件外观的一些信息,我可以帮助您添加代码。

更新

例如,下面是我解析的代码(可能需要5分钟才能改进):

 /**
 *
 * @param inputFile location of inputFile
 * @return {@link ImmutableSet} of tests to run
 */
public static ImmutableSet<String> parseConfigFile(File inputFile){
    HashSet<String> innerSet = Sets.newHashSet();
    BufferedReader bufferedReader = null;
    try {
        bufferedReader = new BufferedReader(new FileReader(inputFile));
        String newLine = "";
        while( (newLine = bufferedReader.readLine()) != null){
            Pattern p = Pattern.compile("(.+)=(?=yes|1|true)(.+)");
            Matcher m = p.matcher(newLine);

            while(m.find()){
                //System.out.println(m.group(1));
                innerSet.add(m.group(1));
            }
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if(bufferedReader != null)
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }

    return ImmutableSet.copyOf(innerSet);
}


我为一个看起来像这样的文件进行测试:

  SomeTest=true
  SomeOtherTest=false
  YetAnotherTest=1
  LastTest=yes
  GogoTest=no
  OneMore=0

10-06 14:03
查看更多