public class Lab5_2 implements SingleVariableStats{
static final double undefinedStatsValue = -9999999;
public double mean(double[] dataSet){
double l=0;
double x=0;
if(dataSet.length>1){
for(int i=0;i<dataSet.length-1;i++){
l+=dataSet[i];
}
l=l/dataSet.length;
}else{
l=undefinedStatsValue;
}
return l;
}
public double median(double[] dataSet){
double l=0;
if(dataSet.length>1){
if(dataSet.length%2==1){
double x=dataSet[dataSet.length/2];
double y=dataSet[dataSet.length/2+1];
l=(x+y)/2;
}else{
int b=(int)dataSet[dataSet.length/2];
l=(double)b;
}
}else{
l=undefinedStatsValue;
}
return l;
}
public double stdev(double[] dataSet){
double l=0;
double u=0;
if(dataSet.length>1){
for(int i=0;i<dataSet.length-1;i++){
l+=dataSet[i];
}
l=l/dataSet.length;
for(int i=0;i<dataSet.length-1;i++){
u+=(Math.pow(dataSet[i]-l,2));
}
l=Math.sqrt(u);
}else{
l=undefinedStatsValue;
}
return l;
}
public double[] fiveNumberSummary(double[] dataSet){
double[] l = new double[5];
double y=0;
double n=9;
if(dataSet.length>1){
for(int i=0;i<dataSet.length-1;i++){
if(l[i]>=y){
y=l[i];
l[0]=y;
}
if(l[i]<=n){
n=l[i];
l[4]=n;
}
if(dataSet.length%2==1){
l[1]=dataSet[dataSet.length/2/2];
}else{
int b=(int)dataSet[dataSet.length/2/2];
l[1]=(double)b;
}
if(dataSet.length%2==1){
l[2]=dataSet[dataSet.length/2];
}else{
int b=(int)dataSet[dataSet.length/2*1.5];
l[2]=(double)b;
}
if(dataSet.length%2==1){
l[3]=dataSet[dataSet.length/1.5];
}else{
int b=(int)dataSet[dataSet.length/2*1.5];
l[3]=(double)b;
}
if(l[3]>=l[1]){
x=l[3]-l[1];
}else{
x=l[1]-l[3];
}
}
}else{
l=undefinedStatsValue;
}
return l;
}
public double iqr(double[] dataSet){
double l=0;
if(dataSet.length>1){
l=x;
}else{
l=undefinedStatsValue;
}
return l;
}
public void printAnalysis(double[] dataSet){
if(dataSet.length>1){
System.out.println("n= "+dataSet.toString(dataSet.length));
System.out.println("mean= "+mean.toString(dataSet));
System.out.println("median= "+median.toString(dataSet));
System.out.println("stdev= "+stdev.toString(dataSet));
System.out.println("min= "+fiveNumberSummary.toString(dataSet)
//(some way to get a number from post-array)
System.out.println("Q1= "+fiveNumberSummary.toString(dataSet));
System.out.println("med= "+fiveNumberSummary.toString(dataSet));
System.out.println("Q2= "+fiveNumberSummary.toString(dataSet));
System.out.println("max= "+fiveNumberSummary.toString(dataSet));
System.out.println("iqr= "+iqr.toString(dataSet));
}else{
//format that changes undefinedStatesValue output
}
}
}
我试图打印出每个方法并以不同的方法打印fiveNumberSummary的每个元素。我知道有更好的语法,但最大的问题是以不同的方法打印元素更改。最好的方法是什么?
答案 0 :(得分:0)
在方法fiveNumberSummary(...)
中,您正在修改dataSet
本身。
请注意,它是通过引用访问值,因此您最终会更改最初传递的dataSet
数组。
如果您不想更改实际/传递的数组中的任何值,则应将dataSet
数组复制到另一个数组中。
以下是如何做到这一点:
/* It is a good programming practice to make the formal parameters `final` */
public double[] fiveNumberSummary(final double[] dataSet) {
double[] newDataSet = new double[dataSet.length];
/* Copy Array */
System.arraycopy(dataSet, 0, newDataSet, 0, dataSet.length);
...
/* Use newDataSet instead of dataSet */
...
...
}
上面将创建一个与实际数组具有相同值的新数组,但新引用因此更改此新数组将不再影响实际/传递dataSet
。