查找多个输入数组的总和

Finding the sum of multiple inputted Arrays

我正在寻找多个数组的总和,并搜索了各种代码和程序,但似乎 none 对我有用,或者我应该说 none 实际上让我的大脑工作来创建一个代码基于我所看到的。 “我想要做的是将 3 个输入的成绩数组相加,然后将其除以 3 以获得平均值数组。”

package Activity;

import java.util.*;

public class TestCode {
  static Scanner sc = new Scanner(System.in);
  static int indexMax = 3;

  public static void main(String[] args) {
    String InfoName[][] = new String[indexMax][2];
    Double InfoGrade[][] = new Double[indexMax][3];

    InputInfoName(InfoName);
    InputGrade(InfoGrade);

    PrintInfo(InfoName, ComputeAvg);
  }

  public static String[][] InputInfoName(String NameArr[][]) {
    for (int i = 0; i < indexMax; i++) {
      System.out.println();
      System.out.println("Enter Student[" + (i + 1) + "]'s Full Name");
      System.out.println();

      System.out.print("First Name: ");
      NameArr[i][0] = sc.nextLine();

      System.out.print("Last Name: ");
      NameArr[i][1] = sc.nextLine();
    }
    return NameArr;
  }

  public static Double[][] InputGrade(Double GradeArr[][]) {
    for (int i = 0; i < indexMax; i++) {
      System.out.println();
      System.out.println("Enter Student[" + (i + 1) + "]'s Grades");
      System.out.println();

      System.out.print("1st Grade: ");
      GradeArr[i][2] = sc.nextDouble();

      System.out.print("2nd Grade: ");
      GradeArr[i][3] = sc.nextDouble();

      System.out.print("3rd Grade: ");
      GradeArr[i][4] = sc.nextDouble();
    }
    return GradeArr;
  }
  // Main Problem
  public static Double[][] ComputeAvg(Double ComputeArr[][]) {
    Double AddAvg[][] = new Double[indexMax][];
    Double getAvg[][] = new Double[indexMax][];

    for (int i = 0; i < indexMax; i++) {
      AddAvg[i][] = // I don't know what is next
    }
    return ComputeArr;
  }
  // End of Main Problem
  public static void PrintInfo(String arr[][], Double ComputeAvg[]) {
    System.out.println("");
    System.out.println("Student Info");
    for (int i = 0; i < arr.length; i++) {

      System.out.println("Student[" + i + "]: " + arr[i][0] + "," + arr[i][1] + "     Average: " + ComputeAvg[i]);
    }
  }
}

旁注 就个人而言,我会用原始类型 double 替换 Double 对象的使用,主要是因为(除了性能)可读性,因为在你的代码中并不是真正需要的。

创建将保持数组平均值的数组:

Double AddAvg[] = new Double[indexMax];

遍历数组并使用 Java 流获取这些数组的平均值:

  Arrays.stream(ComputeArr[i])
        .mapToDouble(Double::doubleValue)
        .average()
        .orElse(0);

完整方法:

   public static Double[] ComputeAvg(Double[][] ComputeArr) {
        Double[] AddAvg = new Double[indexMax];

        for (int i = 0; i < indexMax; i++) {
            AddAvg[i] =  Arrays.stream(ComputeArr[i])
                                .mapToDouble(Double::doubleValue)
                                .average()
                                .orElse(0);
        }
        return AddAvg;
    }

如果您不能使用流,那么请手动求和:

public static Double[] ComputeAvg(Double[][] ComputeArr) {
    Double[] AddAvg = new Double[3];
    for (int i = 0; i < 3; i++) {
        double sum = 0.0;
        for(int j = 0; j < ComputeArr[i].length; j++) {
            sum += ComputeArr[i][j];
        }
        AddAvg[i] = sum /  ComputeArr[i].length;
    }
    return AddAvg;
}

在Java数组中索引从0到数组大小-1。所以这个方法:

  public static Double[][] InputGrade(Double GradeArr[][]) {
    for (int i = 0; i < indexMax; i++) {
      System.out.println();
      System.out.println("Enter Student[" + (i + 1) + "]'s Grades");
      System.out.println();

      System.out.print("1st Grade: ");
      GradeArr[i][2] = sc.nextDouble();

      System.out.print("2nd Grade: ");
      GradeArr[i][3] = sc.nextDouble();

      System.out.print("3rd Grade: ");
      GradeArr[i][4] = sc.nextDouble();

    }
    return GradeArr;
  }

正在访问数组边界外的位置 GradeArr(即 GradeArr[i][4])。更改为:

  public static Double[][] InputGrade(Double GradeArr[][]) {
    for (int i = 0; i < indexMax; i++) {
      System.out.println();
      System.out.println("Enter Student[" + (i + 1) + "]'s Grades");
      System.out.println();

      System.out.print("1st Grade: ");
      GradeArr[i][0] = sc.nextDouble();

      System.out.print("2nd Grade: ");
      GradeArr[i][1] = sc.nextDouble();

      System.out.print("3rd Grade: ");
      GradeArr[i][2] = sc.nextDouble();

    }
    return GradeArr;
  }

如果可以使用 Stream API,可以使用 DoubleStream::average:

计算 2D Double 数组的平均值
static Double[] calcAvg(Double[][] arr) {
    return Arrays
        .stream(arr) // Stream<Double[]>
        .map(inner -> Arrays.stream(inner)   // Stream<Double>
                .mapToDouble(Double::doubleValue) // convert to primitive double
                .average()    // average calculated as OptionalDouble
                .orElse(0.0)  // in case of empty array
        )
        .toArray(Double[]::new);
}

此外,Collectors::averagingDouble 可用于使其更简洁:

static Double[] calcAvg(Double[][] arr) {
    return Arrays
        .stream(arr) // Stream<Double[]>
        .map(inner -> Arrays.stream(inner)
                .collect(Collectors.averagingDouble(Double::doubleValue)) // or x -> x
        )
        .toArray(Double[]::new);
}

测试

Double[][] arr = {
  {},
  {0.1},
  {1.0, 2.0, 3.0},
  {4.0, 5.0, 6.0, 7.0, 8.0},
  {5.0, 11.0, 17.0, 23.0, 29.0, 35.0},
};

System.out.println(Arrays.toString(calcAvg(new Double[0][])));
System.out.println(Arrays.toString(calcAvg(arr)));

输出:

[]
[0.0, 0.1, 2.0, 6.0, 20.0]