当前位置: 首页 > 知识库问答 >
问题:

我如何平均ArrayList中的内容?

庄子平
2023-03-14
public class TestCode {

    private int eachTwoSec;

    // supposed to aList.add 10 items
    // average the time needed in between each aList.add (2 obviously)
    public void avgTimeTaken() {
        ArrayList aList = new ArrayList();
        for (int i = 0; i < 10; i++) {
            aList.add(eachTwoSec);
        }
    }

    // return a number every two seconds (endless stream of samples)
    // samples 50,52,54,56,58,60,2,4,6,8,10
    public void twoSecTime() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ex) {
            Logger.getLogger(Dummies.class.getName()).log(Level.SEVERE, null, ex);
        }

        LocalDateTime ldt = LocalDateTime.now();
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("ss");
        eachTwoSec = Integer.parseInt(ldt.format(dtf));
        System.out.println(eachTwoSec);
        twoSecTime();
    }

    public TestCode() {
        // construct
        avgTimeTaken();
        new Thread(this::twoSecTime).start();
    }

    public static void main(String[] args) {
        // just a start point
        new TestCode();
    }
}

共有1个答案

文喜
2023-03-14

这可能有助于做你想做的事情(或者给你一个可以继续的地方)。

  • 我使用定时器每隔2000毫秒采取一次行动。我更喜欢使用Swing计时器,而不是在TimerTasks
  • 上乱来
  • 我不只是添加2秒,而是获取当前纳秒时间
  • 这会引入由代码的各个部分和同步性引入的延迟错误。
  • 我将微秒添加到数组列表中。这些值的形式是从最近的值到以前记录的值的增量。
  • 当count==10时,我停止计时器并调用平均方法。
  • 大部分工作都是在EDT上完成的(通常情况下是一件坏事,但对于本练习来说是可以的)。如果这是一个问题,可以启动另一个线程来处理负载。
  • 然后使用原始主线程发出wait的信号,离开JVM。Imo,首选系统.exit(0);

收集的数据和最终的平均值都是以微秒为单位的。

import java.util.ArrayList;
import javax.swing.Timer;

public class TestCode {
    
    Timer timer;
    int delay = 2000; // milliseconds
    int count = 0;
    long last;
    
    ArrayList<Integer> aList = new ArrayList<>();
    Object mainThread;
    
    public void avgTimeTaken() {
        
        double sum = 0;
        for (Integer secs : aList) {
            sum += secs;
        }
        System.out.println("Avg = " + sum / aList.size());
    }
    
    public void twoSecTime() {
        long now = System.nanoTime();
        int delta = (int) (now / 1000 - last / 1000); // microseconds
        last = now;
        aList.add(delta);
        System.out.println(delta);
        count++;
        if (count == 10) {
            // stop the time
            timer.stop();
            // get the averages
            avgTimeTaken();
            // wake up the wait to exit the JVM
            // twoSecTime is run on the EDT via timer
            // so need to use mainThread
            synchronized (mainThread) {
                mainThread.notifyAll(); 
            }
        }
    }
    
    public static void main(String[] args) {
        new TestCode().start();
    }
    
    public void start() {
        mainThread = this;
        timer = new Timer(2000, (ae) -> twoSecTime());
        last = System.nanoTime(); // initialize last
        timer.start();
        synchronized (this) {
            try {
                wait(); // main thread waiting until all is done
            } catch (InterruptedException ie) {
                ie.printStackTrace();
            }
        }
    }
}
 类似资料:
  • 我试图从购物车(ArrayList)中计算平均值。平均值是指所有产品的总和除以它的数量?,如果我错了请纠正我,也许这就是为什么我的逻辑不太好用。 我试图做一个循环来计算所有乘积的总和,然后除以它的数量。

  • 问题内容: 任何人都知道如何计算这些列之一的平均值(在Linux上)? 例如:mean(第2栏) 问题答案: Awk: 读为: 对于每一行,将第2列添加到变量“总计”中。 在文件末尾,打印“总计”除以记录数。

  • 问题内容: 我正在尝试学习SQL,所以请耐心等待。我正在使用PostgreSQL 9.3 我想根据日期窗口对一列进行平均。我能够编写窗口函数来完成一个集合,但是我希望能够随着不断增长做到这一点。我的意思是: 我假设有一个比对我要平均的每个范围运行查询更好的方法。任何建议表示赞赏。谢谢你。 编辑 我正在尝试创建均匀分布的垃圾箱,以用于汇总表的值。 我的间隔是: 这里是一个表的列 并且 是并列我想表分

  • 希望这对你来说是有意义的,我很乐意更详细地解释这个问题。

  • 我想单独打印ArrayList中的每个值,即{1=[A,B,C,D],2=[E,F,G,H]} 如果用户输入2(即键),则输出应为E F G H

  • 我是新来的Java,我正在写一个程序来管理学生,他们的科目和该科目的成绩。 代码询问学生的详细信息,然后将所有信息保存到Arraylist。我试图得到一个科目的平均成绩,但没有成功,我已经计算了某个学生的平均成绩,但是从某个科目获得所有成绩,然后计算平均成绩超出了我的理解范围。 这是我用于创建Arraylist的代码: 这是学生班的代码: 我试过类似的方法 但是我不知道如何只选择某个学科的成绩,而