平均二维数组列
Averaging 2d array columns
我正在尝试计算二维数组列的平均值。我的代码似乎将行中的数字相加,然后除以总数。在这个例子中应该只有 4 次赋值,但它循环了 12 次。有人知道我的代码有什么问题吗?这些数字是从一个文本文件输入的,在完整代码中更高(不确定是否会影响它)。
示例数组:
[2,3,6,7]
[4,5,6,7]
[2,2,2,2]
System.out.println("Average score of each assignment:");
//TODO: compute and print the average on each assignment
double total = 0;
int totallength = 0;
int assignment = 1;
for (int i = 0; i < myArray.length; i++) {
for (int j = 0; j < myArray[i].length; j++) {
total += myArray[i][j];
totallength++;
System.out.println("Assignment #" + assignment++
+ " Average: " + (total / totallength));
}
}
这是我的输出:
Average score of each assignment:
Assignment #1 Average: 2.0
Assignment #2 Average: 2.5
Assignment #3 Average: 3.6666666666666665
Assignment #4 Average: 4.5
Assignment #5 Average: 4.4
Assignment #6 Average: 4.5
Assignment #7 Average: 4.714285714285714
Assignment #8 Average: 5.0
Assignment #9 Average: 4.666666666666667
Assignment #10 Average: 4.4
Assignment #11 Average: 4.181818181818182
Assignment #12 Average: 4.0
期望的输出:
Assignment #1 Average: 2.666666666
Assignment #2 Average: 3.333333333
Assignment #3 Average: 4.666666666
Assignment #4 Average: 5.333333333
如果你想得到每一行的平均值,你需要在每个其他循环上初始化你的总计数器,并且在求和后只在外循环上打印:
int assignment=1;
for(int i=0;i<myArray.length;i++) {
// initialize here, to start each row separatly
double total=0;
int totallength=0;
for(int j=0;j<myArray[i].length;j++) {
total+=myArray[i][j];
totallength++;
}
// print after the loop, so it will be done only once per row
System.out.println("Assignment #" + assignment++ + " Average: " + (total/totallength));
}
顺便说一句,计算平均值的更简单方法是利用 java 8 流功能:
for(int i=0;i<myArray.length;i++) {
double average = Arrays.stream(myArray[i]).average().orElse(0d);
}
您可以按照以下方式进行:
public class Main {
public static void main(String[] args){
int [][]myArray= {
{2,3,6,7},
{4,5,6,7},
{2,2,2,2},
};
double total=0;
int assignment=1;
System.out.println("Average score of each assignment:");
for(int i=0;i<myArray[0].length;i++) {
for(int j=0;j<myArray.length;j++) {
total+=myArray[j][i];
}
System.out.println("Assignment #" + assignment++ + " Average: " + (total/3));
total=0;
}
}
}
输出:
Average score of each assignment:
Assignment #1 Average: 2.6666666666666665
Assignment #2 Average: 3.3333333333333335
Assignment #3 Average: 4.666666666666667
Assignment #4 Average: 5.333333333333333
您可以使用IntStream.average()
方法:
int m = 3;
int n = 4;
int[][] arr = {
{2, 3, 6, 7},
{4, 5, 6, 7},
{2, 2, 2, 2}};
double[] averages = IntStream.range(0, n)
.mapToDouble(i -> IntStream.range(0, m)
.map(j -> arr[j][i])
.average()
.orElse(0))
.toArray();
// output
IntStream.range(0, averages.length).forEach(i ->
System.out.println("Assignment #" + (i + 1)
+ " Average: " + (averages[i])));
Assignment #1 Average: 2.6666666666666665
Assignment #2 Average: 3.3333333333333335
Assignment #3 Average: 4.666666666666667
Assignment #4 Average: 5.333333333333333
我正在尝试计算二维数组列的平均值。我的代码似乎将行中的数字相加,然后除以总数。在这个例子中应该只有 4 次赋值,但它循环了 12 次。有人知道我的代码有什么问题吗?这些数字是从一个文本文件输入的,在完整代码中更高(不确定是否会影响它)。
示例数组:
[2,3,6,7]
[4,5,6,7]
[2,2,2,2]
System.out.println("Average score of each assignment:");
//TODO: compute and print the average on each assignment
double total = 0;
int totallength = 0;
int assignment = 1;
for (int i = 0; i < myArray.length; i++) {
for (int j = 0; j < myArray[i].length; j++) {
total += myArray[i][j];
totallength++;
System.out.println("Assignment #" + assignment++
+ " Average: " + (total / totallength));
}
}
这是我的输出:
Average score of each assignment:
Assignment #1 Average: 2.0
Assignment #2 Average: 2.5
Assignment #3 Average: 3.6666666666666665
Assignment #4 Average: 4.5
Assignment #5 Average: 4.4
Assignment #6 Average: 4.5
Assignment #7 Average: 4.714285714285714
Assignment #8 Average: 5.0
Assignment #9 Average: 4.666666666666667
Assignment #10 Average: 4.4
Assignment #11 Average: 4.181818181818182
Assignment #12 Average: 4.0
期望的输出:
Assignment #1 Average: 2.666666666
Assignment #2 Average: 3.333333333
Assignment #3 Average: 4.666666666
Assignment #4 Average: 5.333333333
如果你想得到每一行的平均值,你需要在每个其他循环上初始化你的总计数器,并且在求和后只在外循环上打印:
int assignment=1;
for(int i=0;i<myArray.length;i++) {
// initialize here, to start each row separatly
double total=0;
int totallength=0;
for(int j=0;j<myArray[i].length;j++) {
total+=myArray[i][j];
totallength++;
}
// print after the loop, so it will be done only once per row
System.out.println("Assignment #" + assignment++ + " Average: " + (total/totallength));
}
顺便说一句,计算平均值的更简单方法是利用 java 8 流功能:
for(int i=0;i<myArray.length;i++) {
double average = Arrays.stream(myArray[i]).average().orElse(0d);
}
您可以按照以下方式进行:
public class Main {
public static void main(String[] args){
int [][]myArray= {
{2,3,6,7},
{4,5,6,7},
{2,2,2,2},
};
double total=0;
int assignment=1;
System.out.println("Average score of each assignment:");
for(int i=0;i<myArray[0].length;i++) {
for(int j=0;j<myArray.length;j++) {
total+=myArray[j][i];
}
System.out.println("Assignment #" + assignment++ + " Average: " + (total/3));
total=0;
}
}
}
输出:
Average score of each assignment:
Assignment #1 Average: 2.6666666666666665
Assignment #2 Average: 3.3333333333333335
Assignment #3 Average: 4.666666666666667
Assignment #4 Average: 5.333333333333333
您可以使用IntStream.average()
方法:
int m = 3;
int n = 4;
int[][] arr = {
{2, 3, 6, 7},
{4, 5, 6, 7},
{2, 2, 2, 2}};
double[] averages = IntStream.range(0, n)
.mapToDouble(i -> IntStream.range(0, m)
.map(j -> arr[j][i])
.average()
.orElse(0))
.toArray();
// output
IntStream.range(0, averages.length).forEach(i ->
System.out.println("Assignment #" + (i + 1)
+ " Average: " + (averages[i])));
Assignment #1 Average: 2.6666666666666665
Assignment #2 Average: 3.3333333333333335
Assignment #3 Average: 4.666666666666667
Assignment #4 Average: 5.333333333333333