有没有更好的方法来搜索此列表中的任意值?

时间:2013-04-30 11:40:06

标签: java checkstyle

我需要这样做,检查java.sql.PreparedStatement的导入,我有解析树,包含该列表上的import语句,我想检查它,代码alredy工作,但它看起来像是不是最好的,是否有更好的方法来查看此列表?

List<DetailAST> packageDefinition = findAllAstsOfType(aAST, TokenTypes.IDENT);
        for (int j = 0; j < packageDefinition.size() - 2; j++) {
            if (packageDefinition.get(j).getText().equals("java")) {
                if (packageDefinition.get(j + 1).getText().equals("sql")) {
                    if (packageDefinition.get(j + 2).getText().equals("PreparedStatement")) {
                        importsPreparedStatement = true;
                    }
                }
            }
        }

4 个答案:

答案 0 :(得分:2)

除了将3个ifs组合成一个:

if(statement1 && statement2 && statement3)

还有一些其他想法可以想到:

如果importsPreparedStatement只需要为真,那么您可以在break;设置为true之后true。因此,如果在将字段设置为break;后使用if,则无法再进行搜索。

从设计角度来看,您可以将doesImportPreparedStatement组合成isImportingPreparedStatementcontainsImportPreparedStatementpackageDefinition之类的方法。

我还有一件事。您正在迭代for (int j = 0; j < packageDefinition.size() - 2; j += 3) ,但是您正在检查3个元素。我假设它们被分组为3组,所以你可以这样做:

for(DefinitionElement e : packageDefinitions) {
    if(e.doesImportPreparedStatement()) {
        importsPreparedStatement = true;
        break;
    }
}

从设计的角度来看如果我是你,我会将这3个元素放入他们自己的类中,在这种情况下,你可以简化事情,它看起来像:

DefinitionElement

在后一种情况下,类型j + 2将包含您在数组中组合在一起的3个元素,以及一个可以判断它是否包含预准备语句导入的方法。我认为这种形式更易读,更易于维护。根据我使用索引计算的经验并不好玩,您必须了解上下文才能知道j + 2的含义。

如果您不希望(或不能)将它们移动到自己的类中,您至少可以为索引j + 1和{{1}}命名,以便稍后知道它们是什么意思。

答案 1 :(得分:2)

我真的不了解你的DetailAST类以及如何将不同的对象插入到列表中,但至少可以使用&&而不是嵌套的if语句。

List<DetailAST> packageDefinition = findAllAstsOfType(aAST, TokenTypes.IDENT);
for (int j = 0; j < packageDefinition.size() - 2; j++) {
    if (packageDefinition.get(j).getText().equals("java") &&
        packageDefinition.get(j + 1).getText().equals("sql") &&
        packageDefinition.get(j + 2).getText().equals("PreparedStatement")) {
        importsPreparedStatement = true;
        break;
    }
}

答案 2 :(得分:1)

使用&&运算符将其作为一个条件。喜欢:

if ((packageDefinition.get(j).getText().equals("java"))    && 
    (packageDefinition.get(j + 1).getText().equals("sql")) &&
    (packageDefinition.get(j + 2).getText().equals("PreparedStatement"))) 
{
     importsPreparedStatement = true;
}

因为Java的&&运算符执行 short-circuit

例如,当(packageDefinition.get(j).getText().equals("java"))评估为false时。其他两个不会仅仅因为没有必要进行评估。

答案 3 :(得分:-1)

你可以尝试这个解决方案,它在一个更大的数组中找到一个数组:

public static int findArray(Integer[] array, Integer[] subArray)
{
    if (Collections.indexOfSubList(Arrays.asList(array), Arrays.asList(subArray)) != null)
    {
        importsPreparedStatement = true;
    {
}

只需制作subArray[] = {"java,"sql",PreparedStatement"};