繁体   English   中英

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

[英]Make custom code to reduce number of repetitive lines

我必须从数据库中获取“标签”并将其存储在数组中,以便可以检查我的文档是否包含它们。 由于标签类别(客户,system_dependencies,关键字)的数量,我有多个数组可以与我的文档进行比较。 有没有简单的方法可以简化代码并使代码看起来更好?

这是我的方法,但是对于所有重复的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);

有更好的解决方案吗?

我有两个想法可以简化此过程:首先,您可以在一个以ArrayList作为参数的单独方法中编写常规的for循环。 然后,您依次将其传递给每个ArrayLists ,这意味着至少不必重复for循环。 其次,你可以创建一个ArrayList类型ArrayList和存储您ArrayLists里面。 然后,您可以遍历整个过程。 这两种想法(或它们的组合)唯一明显的缺点是,您需要像对每个ArrayList的搜索一样,为查询字符串命名变量。

您可以做的是使用Map和这样的enum

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的初始化位置。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM