【问题标题】:Averaging 2d array columns平均二维数组列
【发布时间】:2019-11-10 22:27:46
【问题描述】:

我正在尝试平均一个二维数组列。我的代码似乎将数字添加到行中,然后除以总数。在这个例子中应该只有 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

【问题讨论】:

  • 2 个 for 循环,3 个元素之一,4 个元素中的另一个 - 为什么您希望它不会运行 12 次?
  • @NirLevy 抱歉。我解释得不够好。我添加了所需的输出以显示我正在尝试做的事情

标签: java arrays multidimensional-array average


【解决方案1】:

你可以这样做:

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

【讨论】:

  • 3x4 2D 数组只是一个例子。我在数组中的数字来自读入的文本文件。根据这些信息,有没有办法找到它?
  • 抱歉!效果很好!谢谢。
【解决方案2】:

如果你想得到每一行的平均值,你需要在每个 oter 循环上初始化你的总计数器,并且在求和后只在外循环上打印:

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);
} 

【讨论】:

  • 是的,这适用于行。有没有办法为“列”做到这一点?
  • 如果你想为列做,你只需要翻转total+=myArray[i][j];中的i和j变量,让for循环运行到对应的长度。请记住,它仅在所有行的大小相同的情况下才有效
【解决方案3】:

你可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2023-01-27
    • 2019-06-14
    相关资源
    最近更新 更多