java - 如何减少以下程序的执行时间

标签 java for-loop

我有一个要求,其中我必须扫描某些文件以查找某些关键字的匹配。我的关键字列表大小约为 40000 个,所有文件大约有 4000 行。此外,关键字不应在文件中注释,因此我也必须处理注释。我编写的用于了解关键字出现情况的代码对于每个文件大约需要 5 分钟。我不知道我可以做出什么改变来减少执行时间。 代码如下所示。

for (File fl : files) {
        flag = false;
        content = FileUtils.readFileToString(fl);
        System.out.println(fl.getName());
        fileName = fl.getName();

        // Object Keywords scanning
        keywords = null;
        keywords = findKeywordType(fileName);
        if (keywords != null) {
            Boolean keywordCount = false;
            for (String[] key : keywords) {
                key[0] = key[1];
            }
            for (String[] key : keywords) {
                Boolean check = false;
                if (content.contains(key[0])) {
                    if (content.contains(key[3] + ".")) {
                        check = true;
                    }
                    if (check) {
                        continue;
                    }
                    if (content.contains(key[3])) {
                        keywordCount = FindOccurence(fl, key[0], key[3]);
                        if (keywordCount) {
                            System.out.println("Writing keywords");
                            objKwm = new ObjectKeywordMaster();
                            objKwm.setObjectName(key[0]);
                            objKwm.setObjectType(key[1]);
                            objKwm.setObjectOwner(key[2]);
                            objKwm.setDependentObjectName(key[3]);
                            objKwm.setDependentObjectType(key[4]);
                            objKwm.setDependentObjectOwner(key[5]);
                            objKw.getObjectKeywords().add(objKwm);

                        }
                    }
                }
            }
        }

FindOccurrence方法代码为

private static Boolean FindOccurence(File fl, String objectName, String keyword) throws IOException {
        int startComment = 0;
        int endComment = 0;
        Boolean objCheck = false;
        Boolean keyCheck = false;
        Boolean check = false;
        List line = FileUtils.readLines(fl);
        int fileLength = line.size();
        int objCount = 0;
        int keyCount = 0;
        loop:
        for (int j = 0; j < fileLength; j++) {
            if (line.get(j).toString().contains("/*")) {
                startComment = j;
            }
            if (line.get(j).toString().contains("*/")) {
                endComment = j;
            }
            if (line.get(j).toString().contains(objectName)) {
                objCheck = false;
                Pattern p = Pattern.compile("\\b" + objectName + "\\b");
                Matcher m = p.matcher(line.get(j).toString());
                while (m.find()) {
                    objCheck = true;
                    objCount++;
                }
                if (objCheck) {
                    if (line.get(j).toString().contains("#")) {
                        int objIndex = line.get(j).toString().indexOf(objectName);
                        int commentIndex = line.get(j).toString().indexOf("#");
                        if (objIndex > commentIndex) {
                            objCount--;
                        }

                    } else {
                        if (line.get(j).toString().contains("--")) {
                            int objIndex = line.get(j).toString().indexOf(objectName);
                            int commentIndex = line.get(j).toString()
                                    .indexOf("--");
                            if (objIndex > commentIndex) {
                                objCount--;
                            }
                        }
                    }
                    if ((j >= startComment && j <= endComment)||(j >= startComment && endComment==0)) {
                        objCount--;
                    }
                }
            }

            if (line.get(j).toString().contains(keyword)) {
                keyCheck = false;
                Pattern p = Pattern.compile("\\b" + keyword + "\\b");
                Matcher m = p.matcher(line.get(j).toString());
                while (m.find()) {
                    keyCheck = true;
                    keyCount++;
                }
                if (keyCheck) {
                    if (line.get(j).toString().contains("#")) {
                        int objIndex = line.get(j).toString().indexOf(keyword);
                        int commentIndex = line.get(j).toString().indexOf("#");
                        if (objIndex > commentIndex) {
                            keyCount--;
                        }

                    } else {
                        if (line.get(j).toString().contains("--")) {
                            int objIndex = line.get(j).toString().indexOf(keyword);
                            int commentIndex = line.get(j).toString()
                                    .indexOf("--");
                            if (objIndex > commentIndex) {
                                keyCount--;
                            }
                        }
                    }
                    if ((j >= startComment && j <= endComment)||(j >= startComment && endComment==0)) {
                        keyCount--;
                    }
                }
            }
            if(objCount > 0 && keyCount >0){
                check = true;
                break loop;
            } else
                check = false;
        }
        return check;
    }
}

我在同一个列表中发现了两个关键字的两次出现。请建议一些方法,以便我可以减少执行时间。

最佳答案

1) 在开始查找任何关键字之前,准备文件内容:删除注释,...。

2) 将文件内容拆分为文字。

3) 不要循环每个关键字:使用存储所有关键字的 Set。

关于java - 如何减少以下程序的执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30343091/

相关文章:

java - 打破后退按钮上的循环

java - 如何从 JFrame 中删除 JButton?

java - 如何在 64 位 Windows 7 上检索 RAM

Java如何将数组的一个元素与同一数组的所有其他元素进行比较

java - 如何在具有其他 Java 版本的计算机上安装 Java 8

java - 如何将Android应用程序移植到iOS平台?

r - 选择每隔 n 行的数据框并添加到 R 中的数据框列表

java - 使用迭代 for 循环重新执行对象

python - 为什么 "for"循环比循环体多执行一次?

python - 在迭代字典 python 时使用 if