我是一个完整的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");
}
}
}
我跳过了第一行,因为它更容易。
好吧基本上我需要做的是创建每日时间加权平均跳跃。
我可以获得平均跳跃但不是时间加权平均跳跃。
时间加权平均跳跃的公式为=
对于第二次跳跃超过一次的时间,我想在该时间段内进行“平均跳跃”。
但我完全不知道,因为我不太清楚循环如何安排自己。
希望有人可以帮助我!
答案 0 :(得分:1)
在阅读下面的评论并更好地理解您的要求之后,这里有一段代码可以完成这项工作。请注意,它假定每天的时间戳都已排序,如示例所示:
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();
}
}