0

ログ ファイルからユーザー アクション間の平均時間差を見つけようとしています。たとえば、ユーザー アクションua, login, loginと次のユーザー アクションのua, disclaimer ok場合、2 つのアクション間の時間を減算し、その特定の順序が発生するたびに、それらの時間をすべて足し合わせて、そのパターンの発生回数で割ります。

これは私のハッシュマップです

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は、その名前が示すものです。反復すると、 sNextLinesCurrentLine などになります。

私のコードでは、ログ ファイルをループして開き、行がユーザー アクションかどうかを確認し、それらの 2 行を宣言sCurrentLinesNextLineて分割し、ユーザー アクション部分を分離します。次に、アクションの時刻と日付を両方の行から分離し、単純な日付形式を使用して解析し、違いを見つけます。私の望む出力はua, login, login --> ua, disclaimer, ok AVERAGE = 38 secondsです。コード全体を見たい場合は、質問してください。

4

2 に答える 2

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")
    }
}
于 2013-03-18T18:58:38.273 に答える
0

2 レベルのマップを使用する理由が完全には明らかではないように思えます。平均時間を探している場合は、1 つを通過してから次へ進む必要があります。つまり、平均時間は、1 つ 1 つと次の 1 つとの間の時間に基づいています。

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;
}
于 2013-03-18T15:47:51.017 に答える