java - 如何加速哈希表上的多次搜索

标签 java

我有两个带有日志的文件(每个文件有近 5000 行)。每行中的文件都有一组与电子邮件关联的规则,如下所示:

Y#12#EMAIL_1#RULE_1,RULE_2,RULE_3,RULE_4#time=993470174
Y#12#EMAIL_2#RULE_1,RULE_2,RULE_3,RULE_4#time=993470175
Y#12#EMAIL_3#RULE_1,RULE_2,RULE_3#time=9934701778

我使用以下函数来读取文件,并获取每封电子邮件的规则:

private void processFile()
    {
           ArrayList<String[]> lSplitRules = new ArrayList<>();

        try {
            FileInputStream fileStream = new FileInputStream("log.log");
            DataInputStream fileIn = new DataInputStream(fileStream);
            BufferedReader fileBr = new BufferedReader(new InputStreamReader(fileIn));

            String strLine;

            while ((strLine = fileBr.readLine()) != null)
            {
                    String[] lTokens = strLineSpam.split("#");
                    String lRawRules =  lTokens[3];
                    lSplitRules.add(lRawRules.split(","));
            }


        } catch (FileNotFoundException e) {
            System.out.println("File: log.log, not found. Error: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("Couldn't open log.log. Error: " + e.getMessage());
        }

到目前为止,还不错。在 ArrayList 的每个“空间”中,我将有一个包含每封电子邮件的规则的 String[]。另一方面,我还有一个 HashMap,其中包含一个唯一的规则列表,其值如下:

RULE_NAME - VALUE
RULE_1 - 0.1
RULE_2 - 0.5
RULE_3 - 0.6
...

我还需要比较每封电子邮件的每条规则,看看它是否存在于 HashMap 中。如果存在则返回某些计算的规则值 我使用这个函数来实现:

private Double eval (String rule, Map<String, Double> scores)
{

    for (Entry<String, Double> entry : scores.entrySet()) {
        if (entry.getKey().equalsIgnoreCase(rule))
        {
            return entry.getValue();
        }
    }

    return 0.0;
}

问题是我需要多次比较每封电子邮件及其规则(超过 10.000 次),因为我正在使用遗传算法来尝试优化每个规则的值。有没有办法通过HASHMAP来优化每封邮件的规则比较?由于我需要速度,所以我现在在 8 分钟内完成 100 次验证。

抱歉我的英语不好。

问候

最佳答案

拥有哈希表的全部意义在于您可以执行单个哈希查找。如果您只是要循环遍历键,您也可以使用列表。

我不知道您在哪里建立分数,但您可以将情况标准化。

scores.put(key.toLowerCase(), value);

用于不区分大小写的查找

Double d= scores.get(key.toLowerCase());

关于java - 如何加速哈希表上的多次搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11122277/

相关文章:

java - session 和邀请/如何在 DDD 上下文中建模邀请机制?

Java Swing : Write cross platform application (basically CRUD)

java - 不匹配的输入异常 : Cannot deserialize instance of `java.lang.Integer` out of START_OBJECT token

java - 未找到资源 - Styles.xml 和 Theme.AppCompat.Light

java - 使用 for-each 循环遍历页面时的 Selenium 陈旧元素

java - 如何在 Java Swing 中创建可折叠和可展开的面板?

java - 升级到 Spring Boot 2 后应用程序无法启动

java - 在 Jasperreports 上拆分后获取第二个值

java - 使用 Spring Boot 配置 Ehcache TTL 超时

java - JBoss 在 Debug模式下速度极慢