2012-06-20 36 views
0

我有兩個文件(每個近5000行)與日誌。每行中的文件都有一組相關的規則太電子郵件,就像這樣:如何加速HashTable上的多個搜索

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),因爲我m使用遺傳算法來嘗試優化每個RULE的VALUE。無論如何,通過HASHMAP優化每封電子郵件規則的比較?由於我需要速度,現在我在8分鐘內完成了100次驗證。

對不起,我的英語。

問候

回答

2

具有哈希表的整點是這樣一個youc做單個散列查找。如果你只是要循環訪問鍵,你可以使用List。

我不知道你在哪裏建立你的scores,但你可以規範化情況。

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

爲的情況下insensive查找

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