我是个十足的Java新手。从上周一开始,我从来没有用过任何语言编程。因此,如果我发现简单的事情很复杂,请容忍我。
我收到了一份文本文件。如下图所示:
第一个数据是时间(以午夜过后几秒为单位),第二个是得分(不相关),第三个是跳跃(不需要知道这意味着什么……)
我可以很高兴地用下面的代码读到这段代码:
import java.io.FileReader;
import java.io.BufferedReader;
import java.util.ArrayList;
public class ReadText {
public static void main(String[] args) throws Exception {
String InputFile="C:\\PracticeSpreads.txt";
ArrayList<String> fileLines=new ArrayList<String>();
FileReader fr;
BufferedReader br;
fr = new FileReader(InputFile);
br = new BufferedReader(fr);
String line;
br.readLine();
while ((line=br.readLine()) != null) {
fileLines.add(line);
//System.out.print(line+"\n");
}
}
}我跳过了第一行,因为这样更容易。
好的,基本上我需要做的是创建一个每日时间加权平均跳跃。
我可以得到平均跳跃,但不是时间加权平均跳跃。
时间加权平均跳跃is=公式
对于一秒有多个跳跃的时候,我想要取该时间段的“平均跳跃”。
但我真的不知道,因为我不太确定循环是如何排列的。
希望有人能帮帮我!
发布于 2010-07-12 18:26:25
在阅读了你的评论并更好地理解了你的需求之后,这里有一段代码可以完成这项工作。请注意,它假设每天的时间戳都已排序,如您的示例所示:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.AbstractMap.SimpleEntry;
public class ReadText {
public static void main(String[] args) throws IOException {
BufferedReader br = null;
try {
String InputFile = "C:\\PracticeSpreads.txt";
br = new BufferedReader(new FileReader(InputFile));
String line;
List<SimpleEntry<Integer, List<Double>>> valuesInDay = new ArrayList<SimpleEntry<Integer, List<Double>>>();
String date = null;
while ((line = br.readLine()) != null) {
line = line.trim();
if (line.startsWith("DATE")) {
if (line.equals(date)) // Found day footer
System.out.println("Average for " + date + ": " + calcDayAvg(valuesInDay));
else { // Found a day header
valuesInDay.clear();
date = line;
}
} else { // Found a value entry
Scanner s = new Scanner(line);
int sec = s.nextInt();
s.nextDouble();
double jump = s.nextDouble();
List<Double> jumps;
if (!valuesInDay.isEmpty() && valuesInDay.get(valuesInDay.size() - 1).getKey() == sec) {
// Same time stamp as prev
jumps = valuesInDay.get(valuesInDay.size() - 1).getValue();
}else {
// New time stamp
jumps = new ArrayList<Double>();
valuesInDay.add(new SimpleEntry<Integer, List<Double>>(sec, jumps));
}
jumps.add(jump);
}
}
} finally {
if (br != null)
br.close();
}
}
private static Double calcDayAvg(List<SimpleEntry<Integer, List<Double>>> values) {
if (values.isEmpty())
return null; // No way to calculate for empty set
double min = values.get(0).getKey();
double max = values.get(values.size() - 1).getKey();
double span = max - min;
if (span == 0)
return null; // Division by zero...
double total = 0;
for (int i=0; i < values.size(); i++) {
SimpleEntry<Integer, List<Double>> entry = values.get(i);
int sec = entry.getKey();
double jumpAvg = getJumpAvg(entry.getValue());
int jumpDuration;
if (i == values.size() - 1)
jumpDuration = 1; // last jump has duration of 1 sec
else
jumpDuration = values.get(i + 1).getKey() - sec;
total += jumpAvg * jumpDuration;
}
return total / span;
}
private static double getJumpAvg(List<Double> jumps) {
double total = 0;
for (Double jump : jumps) {
total += jump;
}
return total / jumps.size();
}
}https://stackoverflow.com/questions/3227413
复制相似问题