Java平均值,跳转

时间:2010-07-12 09:50:03

标签: java

我是一个完整的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");



 }

 }
 }

我跳过了第一行,因为它更容易。

好吧基本上我需要做的是创建每日时间加权平均跳跃。

我可以获得平均跳跃但不是时间加权平均跳跃。

时间加权平均跳跃的公式为=

对于第二次跳跃超过一次的时间,我想在该时间段内进行“平均跳跃”。

但我完全不知道,因为我不太清楚循环如何安排自己。

希望有人可以帮助我!

1 个答案:

答案 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();
    }
}