0

ログを含む 2 つのファイル (それぞれ約 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[] があります。一方、ルールの一意のリストを 1 つ含む 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 件の検証を行っています。

私の英語でごめんなさい。

よろしく

4

1 に答える 1

2

ハッシュテーブルを持つことの要点は、単一のハッシュルックアップを実行できるようにすることです。キーをループするだけの場合は、リストを使用することもできます。

をどこで構築しているのかわかりませんがscores、大文字と小文字を正規化できます。

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

大文字と小文字を区別しないルックアップの場合

Double d= scores.get(key.toLowerCase());
于 2012-06-20T14:57:52.077 に答える