0

我正在尝试从日志文件中查找用户操作之间的时间平均差异。因此,例如,对于用户操作ua, login, login和下一个用户操作ua, disclaimer ok,我想减去这两个操作之间的时间,并且每次出现特定顺序时,将这些时间加在一起并除以该模式的出现次数。

这是我的哈希图

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

NumberHolder定义为

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

sCurrentLine并且sNextLine是他们的名字所表明的。迭代时,sNextLine变为 sCurrentLine 等等。

在我的代码中,我遍历日志文件,打开它们,检查一行是否是用户操作,声明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

在我看来,您为什么使用两级地图并不完全清楚。如果你正在寻找平均时间,你应该经历一个然后再到下一个。即平均时间是基于每一个和它之后的时间之间的时间,而不是每个和每隔一个之间的时间。

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 回答