Java:从多个数组中的重复项获取平均时间
我正在编写一个Java类来解析文件,如下所示:Java:从多个数组中的重复项获取平均时间,java,arrays,Java,Arrays,我正在编写一个Java类来解析文件,如下所示: [thread 16] INFO - L3: createOrder: min [239.0] max [1245.0] average [488.06] [thread 16] INFO - L3: translateBarCode: min [9.0] max [132.0] average [31.1] [thread 11] INFO - L3: createOrder: min [258.0] max [2458.0] avera
[thread 16] INFO - L3: createOrder: min [239.0] max [1245.0] average [488.06]
[thread 16] INFO - L3: translateBarCode: min [9.0] max [132.0] average [31.1]
[thread 11] INFO - L3: createOrder: min [258.0] max [2458.0] average [506.31]
[thread 13] INFO - L3: createOrder: min [243.0] max [1303.0] average [542.57]
[thread 11] INFO - L3: translateBarCode: min [9.0] max [104.0] average [29.79]
[thread 13] INFO - L3: translateBarCode: min [9.0] max [129.0] average [37.94]
[thread 5] INFO - L3: createOrder: min [269.0] max [1269.0] average [479.95]
[thread 5] INFO - L3: translateBarCode: min [9.0] max [124.0] average [30.34]
[thread 3] INFO - L3: createOrder: min [236.0] max [1238.0] average [492.35]
[thread 3] INFO - L3: translateBarCode: min [10.0] max [108.0] average [32.04]
[thread 16] INFO - L3: changeOrder: min [662.0] max [4204.0] average [1379.84]
[thread 17] INFO - L3: createOrder: min [236.0] max [1335.0] average [521.18]
[thread 16] INFO - L3: translateBarCode: min [10.0] max [112.0] average [34.87]
[thread 17] INFO - L3: translateBarCode: min [10.0] max [103.0] average [36.45]
[thread 13] INFO - L3: changeOrder: min [617.0] max [4094.0] average [1520.84]
[thread 13] INFO - L3: translateBarCode: min [9.0] max [108.0] average [31.38]
[thread 11] INFO - L3: changeOrder: min [620.0] max [4099.0] average [1316.38]
[thread 5] INFO - L3: changeOrder: min [647.0] max [4154.0] average [1384.15]
[thread 5] INFO - L3: translateBarCode: min [8.0] max [110.0] average [31.42]
...
...
我能够使用基本substr和Collections成功地将其转换为CVS格式。排序类型:
API, Min, Max, Average
capturePayment, 232.0, 1800.0, 687.68
capturePayment, 268.0, 1853.0, 761.44
capturePayment, 301.0, 2612.0, 753.69
capturePayment, 309.0, 2632.0, 766.31
...
...
我的问题是,我想将所有重复的API时间平均化为每个API的一个条目(即每个API的平均最小/最大/平均)。原始文件中存在重复项,并且未排序,因此我不确定如何继续
我最大的问题是API的数量并不总是相同的,即可能有10个capturePayment调用,但有20个createOrders。否则,我有一个大致可行的模型。谁能给我一些指点吗
[编辑]
有了下面的“registerAPI”解决方案,我就快到了。计算的平均值与Excel中应基于的值略有偏差。这是我的密码。我唯一的想法可能是从弦乐到双打打乱了精确度
while ((line = br.readLine()) != null) {
if (line.contains("L3")) {
int x,y;
x = line.indexOf("L3: ") + "L3: ".length();
y = line.indexOf(":", x);
String name = line.substring(x,y).trim();
x = line.indexOf("min [") + "min [".length();
y = line.indexOf("]", x);
String min = line.substring(x,y).trim();
x = line.indexOf("max [") + "max [".length();
y = line.indexOf("]", x);
String max = line.substring(x,y).trim();
x = line.indexOf("average [") + "average [".length();
y = line.indexOf("]", x);
String average = line.substring(x,y).trim();
pStreamArray.add(name + ", " + min + ", " + max + ", " + average);
double[] apiValues = new double[3];
apiValues[0] = Double.valueOf(min);
apiValues[1] = Double.valueOf(max);
apiValues[2] = Double.valueOf(average);
parseAPILogs.registerAPI(name, apiValues);
}
}
Iterator iterator = averagePerAPI.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next().toString();
double[] values = averagePerAPI.get(key);
String valueString = "";
for (int i = 0; i < values.length; i++) {
valueString += values[i] + ", ";
}
System.out.println(key + " " + valueString);
pStreamCombined.println(key + " " + valueString);
}
while((line=br.readLine())!=null){
如果(第三行包含(“L3”)){
int x,y;
x=line.indexOf(“L3:”)+“L3:”.length();
y=行索引of(“:”,x);
String name=line.substring(x,y).trim();
x=line.indexOf(“min[”)+“min[”.length();
y=行索引of(“]”,x);
字符串min=line.substring(x,y).trim();
x=line.indexOf(“max[”)+“max[”.length();
y=行索引of(“]”,x);
String max=line.substring(x,y).trim();
x=line.indexOf(“average[”)+“average[”.length()”;
y=行索引of(“]”,x);
字符串平均值=line.substring(x,y).trim();
pStreamArray.add(名称+”、“+min+”、“+max+”、“+average”);
double[]apiValues=新的双精度[3];
apiValues[0]=双精度值(最小值);
apiValues[1]=双精度值(最大值);
apiValues[2]=双精度值(平均值);
registerAPI(名称、apiValues);
}
}
迭代器迭代器=averagePerAPI.keySet().Iterator();
while(iterator.hasNext()){
字符串键=迭代器.next().toString();
double[]value=averagePerAPI.get(键);
字符串值字符串=”;
对于(int i=0;i
[编辑]
我在上面的代码中发现了数学上的缺陷——3个数字的平均值不等于前两个数字的平均值,然后是第三个数字的平均值 例如: (395+415+412)/3=407.33 (395+415)/2=405
(405+412)/2=408.5在我看来,您可以通过
映射和平均容器来实现这一点
容器是一个类,其当前总和为MIN
、MAX
和AVERAGE
,以及当前计数:
public class APIData {
private double min;
private double max;
private double average;
private int amount;
public void addValues(double[] values) {
min += values[0];
max += values[1];
average += values[2];
amount++;
}
public double getAPIMin() {
return min / amount;
}
public double getAPIMax() {
return max / amount;
}
public double getAPIAverage() {
return average / amount;
}
}
在地图上:
Map<String,APIData> averagePerAPI = new LinkedHashMap<String,int[]>();
当您想知道一个API的特定值时,只需调用getAPIMin()
、getAPIMax()
或getapimage()
方法。听起来像是1)您想创建一个类来保存一个“记录”(一个API的最小值/最大值/平均值),2)将它们保存在某种“列表”(可能是数组列表,也可能是映射)中保存和检索您的记录。谢谢,这真是太聪明了。我已经实现了它,它几乎可以正常工作。它计算的平均值与我在Excel中计算时的预期值略有出入。抱歉,这里似乎没有过去的代码,让我编辑原始帖子。我发现了上面代码中的数学缺陷-平均值为3数字不等于前两个数字的平均值,然后是第三个数字的平均值。例如:(395+415+412)/3=407.33,(395+415)/2=405=>(405+412)/2=408.5@Matt我今天醒来时发现了同样的情况,马上过来纠正。它的平均值是2,我会编辑我的答案……有时我会给自己投反对票。故事的士气:在你不睡觉的时候写代码哈哈。@Matt,现在应该可以了。非常感谢你的帮助。这个解决方案简单、干净,而且有效非常好。我之前在玩一个像这样的单独的类,但不能很好地让它工作。谢谢!:)
public void registerAPI(String apiName, double[] apiValues) {
if(!averagePerAPI.containsKey(apiName)) {
APIData data = new APIData();
data.addValues(apiValues)
averagePerAPI.put(apiName, data);
} else {
averagePerAPI.get(apiName).addValues(apiValues);
}
}