首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Average,跳跃

Java Average,跳跃
EN

Stack Overflow用户
提问于 2010-07-12 17:50:03
回答 1查看 313关注 0票数 1

我是个十足的Java新手。从上周一开始,我从来没有用过任何语言编程。因此,如果我发现简单的事情很复杂,请容忍我。

我收到了一份文本文件。如下图所示:

第一个数据是时间(以午夜过后几秒为单位),第二个是得分(不相关),第三个是跳跃(不需要知道这意味着什么……)

我可以很高兴地用下面的代码读到这段代码:

代码语言:javascript
复制
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=公式

对于一秒有多个跳跃的时候,我想要取该时间段的“平均跳跃”。

但我真的不知道,因为我不太确定循环是如何排列的。

希望有人能帮帮我!

EN

回答 1

Stack Overflow用户

发布于 2010-07-12 18:26:25

在阅读了你的评论并更好地理解了你的需求之后,这里有一段代码可以完成这项工作。请注意,它假设每天的时间戳都已排序,如您的示例所示:

代码语言:javascript
复制
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();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3227413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档