Java 是否有更好的方法搜索此列表中的任意值?

Java 是否有更好的方法搜索此列表中的任意值?,java,checkstyle,Java,Checkstyle,我需要这样做,检查java.sql.PreparedStatement的导入,我有一个解析树,其中包含该列表上的导入语句,我想检查它,代码alredy可以工作,但它看起来不是最好的,有没有更好的方法来检查这个列表 List<DetailAST> packageDefinition = findAllAstsOfType(aAST, TokenTypes.IDENT); for (int j = 0; j < packageDefinition.size() -

我需要这样做,检查java.sql.PreparedStatement的导入,我有一个解析树,其中包含该列表上的导入语句,我想检查它,代码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;
                    }
                }
            }
        }
List packageDefinition=findAllAstsOfType(aAST,TokenTypes.IDENT);
对于(int j=0;j
除了将3个ifs组合成一个ifs外:

if(statement1 && statement2 && statement3)
我还想到了其他一些想法:

如果
importsPreparedStatement
只需为true一次,则可以
中断true
后的code>。因此,如果在将字段设置为
true
后再也没有搜索的意义,请使用
break

从设计的角度来看,您可以将
if
组合成一个方法,如
doesImportPreparedStatement
isImportingPreparedStatement
,或者
containsImportPreparedStatement

我还看到一件事。您正在迭代您的
包定义
,但您正在逐个检查3个元素。我假设它们被分成3组,因此您可以这样做:

for (int j = 0; j < packageDefinition.size() - 2; j += 3)
在后一种情况下,type
DefinitionElement
将包含数组中组合在一起的3个元素,以及一个可以判断它是否包含预处理语句导入的方法。我认为这个表格更容易阅读和维护。根据我的经验,使用索引进行计算并不有趣,你必须了解上下文才能知道
j+2
的含义


如果您不想(或不能)将它们移动到自己的类中,您至少可以为索引
j+2
j+1
指定一个名称,以便您稍后了解它们的含义

我不太了解您的
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;
    }
}
List packageDefinition=findAllAstsOfType(aAST,TokenTypes.IDENT);
对于(int j=0;j
您可以尝试此解决方案,在较大的阵列中找到一个阵列:

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

只需将
子数组[]={“java”,sql,PreparedStatement”}

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

if ((packageDefinition.get(j).getText().equals("java"))    && 
    (packageDefinition.get(j + 1).getText().equals("sql")) &&
    (packageDefinition.get(j + 2).getText().equals("PreparedStatement"))) 
{
     importsPreparedStatement = true;
}
因为Java的
&&
操作符执行


例如,当
(packageDefinition.get(j).getText().equals(“java”))计算为false时。另外两个将不会被评估,因为它不是必需的。

您可以做的一件事是添加一个
中断importsPreparedStatement=true后的code>语句。就像马巴说的,你可以把一个
中断importsPreparedStatement=true之后的语句。此外,我猜您可能有许多
java.sql.
imports,因此首先检查定义的(j+2)部分可能是一个小小的改进。这可能会减少比较的次数。我认为将元素组移动到它们自己的类是更好的方法。DetailAst是代码的解析树节点,它包含一个带有类型及其兄弟和儿子的标记,在这种情况下,我要查找import语句并检查下面的IDENT节点,这构成了要导入的包的名称,它是一个checkstyle类,我不完全了解它的功能,我只是从代码库中获得了很多参考代码。感谢您的提示,我对java非常陌生,这是对操作符工作的一个很好的了解,我不确定我是否可以做到这一点,而不必每次都评估所有的条件。
if ((packageDefinition.get(j).getText().equals("java"))    && 
    (packageDefinition.get(j + 1).getText().equals("sql")) &&
    (packageDefinition.get(j + 2).getText().equals("PreparedStatement"))) 
{
     importsPreparedStatement = true;
}