如何实现java类的java接口

如何实现java类的java接口,java,arraylist,interface,Java,Arraylist,Interface,我需要帮助解决以下问题: 创建一个类Statistics.java来实现StatisticsI.java。java包含要存储到双精度类型的数据对象的ArrayList数据,以及属性(attributes):count、min、max、mean、std。该实现具有以下规范 addData(Double d) adds data d into the array list, and then update the values of count, min, max, mean, and std, u

我需要帮助解决以下问题: 创建一个类Statistics.java来实现StatisticsI.java。java包含要存储到双精度类型的数据对象的ArrayList数据,以及属性(attributes):count、min、max、mean、std。该实现具有以下规范

addData(Double d) adds data d into the array list, and then update the values of count, min, max, mean, and std, using incremental algorithms, i.e. using exiting existing value to calculate new values, rather than calculating by traversal through the data array.
getCount() returns count.
getMin() returns min.
getMax() returns max.
getMean() returns mean.
getSTD() returns std.
stats() computes the count, min, max, mean, and stddev from the data array in one loop, and then sets the values of the properties.
我有接口

public interface StatisticsI {
    void addData(double d);

    int getCount();

    double getMin();

    double getMax();

    double getMean();

    double getSTD();

    void stats();
}

以下是我到目前为止为实现部分编写的代码

import java.util.ArrayList;

public class Statistics implements StatisticsI {
    private ArrayList<Double> data;
    private long count;
    private double min;
    private double max;
    private double mean;
    private double std;

    public Statistics() {
        data = new ArrayList<Double>();
        count = 0;
        min = 0;
        max = 0;
        mean = 0;
        std = 0;
    }

    public void addData(double d) {
        data.add(d);
        count += 1;
        data.set(data.indexOf(min), min);
        data.set(data.indexOf(max), max);
        data.set(data.indexOf(mean), mean);
        data.set(data.indexOf(std), std);
    }

    public int getCount() {
        count = data.size();
        return (int) count;
    }

    public double getMin() {
        return min;
    }

    public double getMax() {
        return max;
    }

    public double getMean() {
        int mean = 0;
        for (int i = 0; i < data.size(); i++) {
            double currentNum = data.get(i);
            mean += currentNum;
        }
        return mean / data.size();
    }

    public double getSTD() {
        {
            double avg = getMean();
            double t = 0;
            for (int i = 0; i < data.size(); i++) {
                double numbers = data.get(i);
                double value = Math.pow(numbers - avg, 2);
                t += value;
            }
            double std = (double) t / (double) (data.size());
            return Math.sqrt(std);
        }
    }

    public void stats() {
        count = data.size();
    }
}

如何使输出工作?

在addData(..)中,使用“min=Math.min(min,d)”。max也存在,但std和mean更为棘手。通过迭代列表来计算getter中的值可能是最容易的。

您可以在
addData
中立即更新
min
max
mean

更新也可用于计算运行偏差

double min=double.POSITIVE_∞;
双最大值=双负无穷大;
双方差=0.0;
公共无效添加数据(双d){
数据.添加(d);
计数++;
如果(d最大值){
max=d;
}
//用Welford算法固定计算运行均值和方差
双新平均值=平均值+(d-平均值)/计数;
方差+=计数<2?0.0:(d-平均值)*(d-新平均值);
平均值=新的平均值;
标准=计数>1?数学sqrt(方差/(计数-1)):0;
}
或者,您可以使用
data
列表在
stats()
方法中重置所有这些值。 通过
DoubleSummaryStatistics
和Java 8流API,可以方便地一次计算所有统计数据:

public void stats(){
DoubleSummaryStatistics=data.stream().collect(Collectors.summaringDouble(x->x));
count=stats.getCount();//返回的是long值,而不是'int data.size()`
min=stats.getMin();
max=stats.getMax();
mean=stats.getAverage();
std=this.getSTD();
}
公共双getSTD(){
双平均值=getMean();
双t=0.0;
用于(双d:数据){
t+=数学功率(平均d,2);
}
返回Math.sqrt(t/getCount());
}
基于循环的
stats
的“无流”计算,包括
std
可以如下所示:

public void stats(){
count=data.size();
最小值=双正无穷大;
max=Double.NEGATIVE_无穷大;
平均值=0.0;
方差=0.0;
双和=0.0;
双平方=0.0;
int i=0;
用于(双d:数据){
min=数学最小值(min,d);
最大值=数学最大值(最小值,d);
i++;
//按上述方法计算运行平均值,用于方差分析
双新平均值=平均值+(d-平均值)/i;
方差+=i<2?0:(d-平均值)*(d-新平均值);
平均值=新的平均值;
总和+=d;
sq+=d*d;
}
System.out.println(“运行平均值=”+平均值);
std=计数>1?数学sqrt((sq-平均值*平均值/计数)/(计数-1)):0;
平均数=计数==0?0:总和/计数;
}
//重写STD getter以删除所有计算
公共双getSTD(){
返回std;
}
试验

Statistics stats=newstatistics();
统计数据(17);
统计数据(19);
统计数据(24);
System.out.println(“在addData()之后”);
System.out.println(“mean=“+stats.getMean());
System.out.println(“std=“+stats.getSTD());
System.out.println(“在addData()之后”);
stats.stats();
System.out.println(“mean=“+stats.getMean());
System.out.println(“std=“+stats.getSTD());
输出

after addData()
mean=20.0
std=3.605551275463989

after stats()
running mean=20.0
mean=20.0
std=3.605551275463989

你似乎做得对。问题是什么?我不知道如何做addData和stats方法所需的工作。如何更新和计算值。您应该仔细阅读规范。只有stats()和addData()方法应该更改状态。getter应该只返回预先计算的值。在addData()中,规范要求您应该使用增量算法。例如,对于最大值,您应该将新值与最大值进行比较,如果新值更大,则将最大值更改为新值。在stats()中,您必须计算循环中的值。关于更新:您不需要在
main
方法中使用
numList
,您应该将数据添加到
stats
stats.addData(r.nextDouble()*10000)
,然后调用
stats.stats()
更新统计信息。我遵循了这一点,但现在我的主类输出有问题。我更新了我的问题。@newtoMobileDev您没有将值添加到
Statistics
实例,而是添加到一些外部
numList
The count for the list is:0.0
The min for the list is:Infinity
The max for the list is:-Infinity
The mean for the list is:0.0
The standard deviation for the list is:NaN
after addData()
mean=20.0
std=3.605551275463989

after stats()
running mean=20.0
mean=20.0
std=3.605551275463989