2013-03-18 234 views
0

我試圖從日誌文件中找到用戶操作之間的時間平均差異。因此,例如,對於用戶操作ua, login, login和下一個用戶操作ua, disclaimer ok,我想要減去這兩個操作之間的時間,並且對於每次出現特定順序時,將這些時間加在一起併除以發生的次數模式。哈希映射內的哈希映射的平均值

這是我的HashMap

Map<String, HashMap<String, NumberHolder>> uaCount = 
         new HashMap<String, HashMap<String, NumberHolder>>(); 

NumberHolder被定義爲

private class NumberHolder 
{ 
    public int occurences; 
    public int sumtime_in_milliseconds; 
} 

sCurrentLinesNextLine都像它們的名字表示。迭代時,sNextLine變爲sCurrentLine等等。

在我的代碼中,我遍歷日誌文件,打開它們,檢查一行是否是用戶操作,聲明sCurrentLinesNextLine,並分隔這兩行以隔離用戶操作部分。然後,我從兩行中分離出行動的時間和日期,使用簡單的日期格式並解析它們,然後找到差異。我期望的輸出是ua, login, login --> ua, disclaimer, ok AVERAGE = 38 seconds。如果你想看到整個代碼只是問。

+0

什麼是你的問題? – 2013-03-18 15:10:04

+0

@HotLicks以及我不認爲我需要保留最後一次值,只是發生次數和總計時間來計算平均值 – user2007843 2013-03-18 15:10:27

+0

我的問題是如何將出現次數和總和時間添加到基於當前行的散列表中,並且下一行以及如何繼續匹配過程 – user2007843 2013-03-18 15:18:06

回答

1

僞代碼:

function void addLinePair(string1, string2, deltaTime) { 
    // Assumes string1 and string2 have been stripped of variable text 

    keyString = string1 + "|" + string2; 

    hashValue = findInHashTable(keyString); 

    if (hashValue == <not found>) { 

     hashValue = new NumberHolder 
     insertInHashtable(hashValue, keyString) 

    } 

    hashValue.sumtime_in_milliseconds += deltaTime 
    hashValue.occurrences++ 
} 

function void printAverages { 

    for (key,value in hashTable) { 
     string1 = first part of key 
     string2 = second part of key 
     average = (float)value.sumtime_in_milliseconds/(float)value.occurrences 
     print (string1 + " --> " + string2 + ", AVERAGE = " + average + " seconds") 
    } 
} 
+0

我該怎麼做? 'hashValue = new NumberHolder'我得到一個錯誤 – user2007843 2013-03-18 19:53:52

+0

@ user2007843 - 就像我說的,它是僞代碼。我假定你知道如何創建你的對象的實例。 – 2013-03-18 19:57:35

+0

對不起java自動更正,我沒有注意到。我的另一個問題是你在for循環中做什麼? – user2007843 2013-03-18 20:22:01

0

我似乎並不完全清楚爲什麼你使用兩級地圖。如果你正在尋找平均時間,你應該經歷一個,然後到下一個。即平均時間是基於每個人與之後的人之間的時間,而不是每個人和每個人之間的時間。

List<String> logLines = new List<String(); 

//populate logLines 

getLogTime(String a, String b){ 
    long logTimeA = -1; 
    long totalLogTime = 0; 
    long count; 
    for(String logLine : logLines){ 
     if(logLine.equals(a)){ 
      logTimeA = parseForTime(logLine); 
     } 
     else if(logLine.equals(b) && logTimeA >= 0){ 
      totalLogTime += logTimeA - parseForTime(logLine); 
      count++ 
      logTimeA = -1; 
     } 
     //if you want it to only do the one immediately after 
     else if(!logLine.equals(b)){ 
      logTimeA = -1; 
     } 
    } 
    if(count == 0){ 
     return 0; 
    } 
    return totalLogTime/count; 
}