查找多个输入数组的总和
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]
我正在寻找多个数组的总和,并搜索了各种代码和程序,但似乎 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
:
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]