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