制作自定义代码以减少重复行数

时间:2018-01-26 15:56:41

标签: java

我必须得到'标签'从数据库中将它们存储在一个数组中,以便检查我的文档是否包含它们。由于标签类别(customers,system_dependencies,keywords)的数量,我有多个数组来比较我的文档。有一种简单的方法可以简化并使我的代码看起来更好吗?

这是我的方法,但是对于所有重复的for循环看起来很糟糕。

    ArrayList<String> KEYWORDS2 = new ArrayList<String>();
    ArrayList<String> CUSTOMERS = new ArrayList<String>();
    ArrayList<String> SYSTEM_DEPS = new ArrayList<String>();
    ArrayList<String> MODULES = new ArrayList<String>();
    ArrayList<String> DRIVE_DEFS = new ArrayList<String>();
    ArrayList<String> PROCESS_IDS = new ArrayList<String>();

    while (resultSet2.next()) {
        CUSTOMERS.add(resultSet2.getString(1));
    }

    sql = "SELECT da_tag_name FROM da_tags WHERE da_tag_type_id = 6";
    stmt = conn.prepareStatement(sql);
    resultSet2 = stmt.executeQuery();

while (resultSet2.next()) {
        SYSTEM_DEPS.add(resultSet2.getString(1));
    }

    while (resultSet.next()) {
        String da_document_id = resultSet.getString(1);
        String file_name = resultSet.getString(2);

        try {
            if(file_name.endsWith(".docx") || file_name.endsWith(".docm")) {
                System.out.println(file_name);

                XWPFDocument document = new XWPFDocument(resultSet.getBinaryStream(3));
                XWPFWordExtractor wordExtractor = new XWPFWordExtractor(document);

                //Return what's inside the document
                System.out.println("Keywords found in the document:");
                for (String keyword : KEYWORDS) {
                    if (wordExtractor.getText().contains(keyword)) {
                        System.out.println(keyword);
                    }
                }

                System.out.println("\nCustomers found in the document:");
                for (String customer : CUSTOMERS) {
                    if (wordExtractor.getText().contains(customer)) {
                        System.out.println(customer);
                    }
                }

                System.out.println("\nSystem dependencies found in the document:");
                for (String systemDeps : SYSTEM_DEPS) {
                    if (wordExtractor.getText().contains(systemDeps)) {
                        System.out.println(systemDeps);
                    }
                }

                System.out.println("Log number: " + findLogNumber(wordExtractor));

                System.out.println("------------------------------------------");
                wordExtractor.close();

            }

正如你所看到的,还有3个未来,这看起来并不好看。也许有一种方法可以同时比较所有这些。

我再次尝试创建此方法:

public void genericForEachLoop(ArrayList<String> al, POITextExtractor te) {
    for (String item : al) {
        if (te.getText().contains(item)) {
            System.out.println(item);
        }
    }
}

然后调用它:genericForEachLoop(MODULES, wordExtractor);

有更好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

我有两个想法可以缩短它:首先,你可以在一个以ArrayList作为参数的单独方法中编写一个通用的for循环。然后你连续传递每个ArrayLists,这意味着至少你不必重复for循环。其次,您可以创建ArrayList类型ArrayList并将ArrayLists存储在其中。然后你可以迭代整个事情。只有两个想法(或它们的组合)的明显缺点是,您需要为查询字符串命名变量,以便搜索每个ArrayList

答案 1 :(得分:0)

你可以做的是使用Mapenum这样:

enum TagType {
    KEYWORDS2(2), // or whatever its da_tag_type_id is
    CUSTOMERS(4),
    SYSTEM_DEPS(6),
    MODULES(8),
    DRIVE_DEFS(10),
    PROCESS_IDS(12);

    public final daTagTypeId; // this will be used in queries

    TagType(int daTagTypeId) {
        this.daTagTypeId = daTagTypeId;
    }
}

Map<TagType, List<String>> tags = new HashMap<>();
XWPFDocument document = new XWPFDocument(resultSet.getBinaryStream(3));
XWPFWordExtractor wordExtractor = new XWPFWordExtractor(document);

for(TagType tagType : TagType.values()) {
    tags.put(tagType, new ArrayList<>()); // initialize
    String sql = String.format("SELECT da_tag_name FROM da_tags WHERE da_tag_type_id = %d", tagType.daTagTypeId); // build query
    stmt = conn.prepareStatement(sql);
    resultSet2 = stmt.executeQuery();
    while(resultSet2.next()) { // fill from DB
        tags.get(tagType).add(.add(resultSet2.getString(1)));
    }
    System.out.println(String.format("%s found in the document:", tags.get(tagType).name());
    for (String tag : tags.get(tagType)) { // search in text
        if (wordExtractor.getText().contains(tag)) {
            System.out.println(keyword);
        }
    }
}

但此时我不确定你是否需要这些名单:

enum TagType {
    KEYWORDS2(2), // or whatever its da_tag_type_id is
    CUSTOMERS(4),
    SYSTEM_DEPS(6),
    MODULES(8),
    DRIVE_DEFS(10),
    PROCESS_IDS(12);

    public final daTagTypeId; // this will be used in queries

    TagType(int daTagTypeId) {
        this.daTagTypeId = daTagTypeId;
    }
}

XWPFDocument document = new XWPFDocument(resultSet.getBinaryStream(3));
XWPFWordExtractor wordExtractor = new XWPFWordExtractor(document);

for(TagType tagType : TagType.values()) {
    String sql = String.format("SELECT da_tag_name FROM da_tags WHERE da_tag_type_id = %d", tagType.daTagTypeId); // build query
    stmt = conn.prepareStatement(sql);
    resultSet2 = stmt.executeQuery();
    System.out.println(String.format("%s found in the document:", tags.get(tagType).name());
    while(result2.next()) {
        String tag = resultSet2.getString(1);
        if (wordExtractor.getText().contains(tag)) {
            System.out.println(keyword);
        }
    }
}

这一点我不知道那些resultSet被声明和初始化的地方,以及resultSet2初始化的位置。

基本上你只是从DB中获取每种类型的标签,然后直接在文本中搜索它们而不先存储它们然后重新迭代存储的那些......我的意思是这就是数据库的用途。