Как найти общее среднее значение для многомерного массива (Java) - PullRequest
2 голосов
/ 02 апреля 2019

Я очень новичок в Java, и это домашнее задание бросает меня.Я должен распечатать двумерный массив высоких температур в 4 разных днях дня в каждый день недели, а затем получить средние значения времени, средние значения дня и общее среднее значение.Я смог получить все, кроме общего среднего.Я пробовал так много разных вещей, и я не могу заставить его работать.Я знаю, что мне нужно создать какую-то переменную total_sum, чтобы потом разделить ее и получить общее среднее, но я не могу понять, как это сделать.Мне сказали, что мне нужно поместить его за пределы вложенного цикла, например, как я объявил сумму.Я знаю, что это, вероятно, глупый / основной вопрос.

package com.company;

public class Temperatures {

  public static void main(String[] args) {
    System.out.println("Temperature Calculator");
    System.out.println("The data provided are: ");
    int[][] temps = new int[4][7];
    temps[0][0] = 68;
    temps[0][1] = 70;
    temps[0][2] = 76;
    temps[0][3] = 70;
    temps[0][4] = 68;
    temps[0][5] = 71;
    temps[0][6] = 75;
    temps[1][0] = 76;
    temps[1][1] = 76;
    temps[1][2] = 87;
    temps[1][3] = 84;
    temps[1][4] = 82;
    temps[1][5] = 75;
    temps[1][6] = 83;
    temps[2][0] = 73;
    temps[2][1] = 72;
    temps[2][2] = 81;
    temps[2][3] = 78;
    temps[2][4] = 76;
    temps[2][5] = 73;
    temps[2][6] = 77;
    temps[3][0] = 64;
    temps[3][1] = 65;
    temps[3][2] = 69;
    temps[3][3] = 68;
    temps[3][4] = 70;
    temps[3][5] = 74;
    temps[3][6] = 72;


    for (int row = 0; row < 4; row++) {
        String[] times = {"7 AM: ", "3 PM: ", "7 PM: ", "3 AM: "};
        System.out.print(times[row] + " ");
        for (int column = 0; column < 7; column++) {
            System.out.print(temps[row][column] + " ");
        }
        System.out.println();
    }
    System.out.println(" ");

    System.out.println("Based on that data, the following are the average temperatures for the week.");

    int sum;
    for (int column = 0; column < temps[0].length; column++) {
        String[] days = {"Sun: ", "Mon: ", "Tue: ", "Wed: ", "Thu: ", "Fri: ", "Sat: "};
        System.out.print(days[column]);
        sum = 0;
        for (int row = 0; row < temps.length; row++) {
            sum += (temps[row][column]);
        }
        int average = sum / temps.length;
        System.out.println(average);
    }
    System.out.println();

    for (int row = 0; row < temps.length; row++) {
        String[] times = {"7 AM: ", "3 PM: ", "7 PM: ", "3 AM: "};
        System.out.print(times[row]);
        sum = 0;
        for (int column = 0; column < temps.length; column++) {
            sum += (temps[row][column]);
        }
        int average = sum / temps.length;
        System.out.println(average);
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Это также может быть сделано в java 8 способом с потоками и с транспонированием матрицы и функцией, которая вычисляет промежуточный итог.

public class FunctionalMatrixOps<T>
{
UnaryOperator<List<List<T>>> transposeList=m-> {
    List<Iterator<T>> iterList=m.stream().map(List::iterator).collect(Collectors.toList());
    return IntStream.range(0, m.get(0).size())
            .mapToObj(i->iterList.stream().filter(it->it.hasNext())
                    .map(item->item.next()).collect(Collectors.toList())).collect(Collectors.toList());
};

Function<T[][] , List<List<T>>> toList = array ->
Arrays.stream(array)
.map(row -> Arrays.stream(row).collect(Collectors.toList()))
.collect(Collectors.toList());

BiFunction<List<List<T>>,Class<T>, T[][]> toArray = (list,type)->
    list
    .stream()
    .map(row -> row.toArray((T[]) Array.newInstance(type, 0)))
    .collect(Collectors.toList())
    .toArray((T[][]) Array.newInstance(type, 0, 0));

BiFunction<T[][], Class<T>, T[][]> transposeMatrix= 
        (m,type)->toArray.apply(toList.andThen(transposeList).apply(m),type);

Function<Integer[][], List<Integer>> subTotals = 
        matrix->
        IntStream.range(0, matrix.length)
        .mapToDouble(i->Arrays.stream(matrix[i])
                .mapToDouble(Double::new)
                .average().getAsDouble())
        .mapToInt(ii->new Integer((int)ii))
        .boxed().collect(Collectors.toList());
}

Вы можете вызвать эти функции Java 8 следующим образом:

FunctionalMatrixOps<Integer> tc=new FunctionalMatrixOps<Integer>();
    System.out.println("Temperature Calculator");    
List<Integer>avgByHour=tc.subTotals.apply(temps); 
System.out.println("Avg by Hour " + avgByHour);
List<Integer>avgByDayOfWeek=tc.subTotals.apply(tc.transposeMatrix.apply(temps, Integer.class));
System.out.println("Avg by Date of Week " + avgByDayOfWeek);
int avgTotal= (int) avgByHour.stream().mapToDouble(Double::valueOf).average().getAsDouble();
System.out.println("Avg Total (h) " + avgTotal);
int avgTotal2= (int) avgByDayOfWeek.stream().mapToDouble(Double::valueOf).average().getAsDouble();
System.out.println("Avg Total (dow) " + avgTotal2);
}
0 голосов
/ 02 апреля 2019

Я бы попробовал вложенные в циклы.Примерно так ..

int sum = 0;
int indexCounter = 0; // Use this to keep track of the number of 'entries' in the arrays since they may not be perfectly rectangular.
for(int column = 0; column < temps.length; column++) {
    for(int row = 0; row < temps[column].length; row++) {
        sum+= temps[column][row];
        indexCounter++;
    }
}
int average = sum / indexCounter;
System.out.println("The average is " + average);

Если вы точно знали, что в каждой строке одинаковое количество столбцов, вы могли бы сделать что-то вроде

 int average = sum / (temps.length * temps[0].length)
...