[英]How to calculate the average and max/min of an array of calculations from input?
[英]How to exclude numbers from array sum/average/min/max?
我正在为班级分配作业,我试图弄清楚如何获取数组中数字的平均值,同时排除数字-999(用于指示缺少的数据),我想出了如何获取总和/平均/最低/最高等,但我无法弄清楚如何从搜索范围中排除-999。 您可以在前几种方法中看到到目前为止我已经尝试解决的一些事情。 我什至在Google上都找不到任何东西,甚至可能无法开始解释我现在应该做什么。 这些是我要遵循的说明,以下是我当前的代码,感谢您的输入。
/**
* WeatherComputation.java
*/
//Put any imports below this line.
import java.util.*;
/**
* Static methods library which compute averages and other
* computations on integer arrays of temperatures.
*
* @author Joel Swanson
* @version 03.29.2014
*/
public class WeatherComputation
{
/**
* Average an array of temperatures.
* @param temperatures An array storing temperatures as ints.
* @return Returns the average of the array of ints.
*/
public static double averageTemperature(int[] temperatures)
{
int sum = 0;
for (int i = 0; i < temperatures.length; i++)
{
sum += temperatures[i];
}
double average = sum / temperatures.length;
return average;
}
/**
* Find the highest in an array of temperatures.
* @param temperatures An array storing temperatures as ints.
* @return The largest value from the the array of ints.
*/
public static int highestTemperature(int[] temperatures)
{
int max = temperatures[0];
for (int i = 1; i < temperatures.length; i++)
{
if(temperatures[i] > max)
{
max = temperatures[i];
}
}
return max;
}
/**
* Find the lowest in an array of temperatures.
* @param temperatures An array storing temperatures as ints.
* @return The lowest value from the the array of ints.
*/
public static int lowestTemperature(int[] temperatures)
{
int min = 0;
Arrays.sort(temperatures);
while (true)
{
if (min == -999)
{
break;
}
if(min > -999)
{
min = temperatures[0];
}
}
for (int i = 1; i < temperatures.length; i++)
{
if (min < -999)
{
if (temperatures[i] < min)
{
min = temperatures[i];
}
}
}
return min;
}
/**
* Return the total number of missing days. That is days with
* -999 recorded as the temperatures.
* @param temperatures An array storing temperatures as ints.
* @return The number of -999s found.
*/
public static int numberMissing(int[] temperatures)
{
int count = 0;
return count;
}
/**
* Calculate heating degree day.
* @param max The highest temperature for a given day.
* @param min The lowest temperature for a given day.
* @return heating degree day data for this day.
*/
public static double hdd(int max, int min)
{
double hdd = 0.0;
return hdd;
}
/**
* Calculate cooling degree day.
* @param max The highest temperature for a given day.
* @param min The lowest temperature for a given day.
* @return cooling degree day data for this day.
*/
public static double cdd(int max, int min)
{
double cdd = 0.0;
return cdd;
}
/**
* Sum monthly heating degree days.
* @param max An array with the highest temperatures for each day
* in a given month.
* @param min An array with the lowest temperatures for each day
* in a given month.
* @return The sum of the heating degree days.
*/
public static double monthHdd(int[] max, int[] min)
{
double sum = 0.0;
return sum;
}
/**
* Sum monthly cooling degree days.
* @param max An array with the highest temperatures for each day
* in a given month.
* @param min An array with the lowest temperatures for each day
* in a given month.
* @return The sum of the cooling degree days.
*/
public static double monthCdd(int[] max, int[] min)
{
double sum = 0.0;
return sum;
}
}
您确实想为此使用Java 8的流运算符。 如果我采用您的代码,而忽略了未实现的方法,并且没有描述实际计算的内容,那么我会得到:
/**
* WeatherComputation.java
*/
import java.util.*;
import java.util.stream.IntStream;
/**
* Static methods library which compute averages and other
* computations on integer arrays of temperatures.
*
* @author Joel Swanson
* @version 03.29.2014
*/
public class WeatherComputation {
/**
* Filters out all missing values (represented by -999).
*
* @param temperaturs an array storing temperatures as ints.
* @return the list with the missing values removed
*/
private static IntStream getFilteredArray(final int[] temperaturs) {
return IntStream.of(temperaturs)
.filter(i -> i != -999);
}
/**
* Average an array of temperatures.
*
* @param temperatures an array storing temperatures as ints.
* @return the average of the array of ints.
*/
public static double averageTemperature(int[] temperatures) {
// Returns 0 on an empty list. Your code will throw an exception
return getFilteredArray(temperatures).average().orElse(0d);
}
/**
* Find the highest in an array of temperatures.
*
* @param temperatures an array storing temperatures as ints.
* @return the largest value from the the array of ints.
*/
public static int highestTemperature(int[] temperatures) {
return getFilteredArray(temperatures).max().orElse(0);
}
/**
* Find the lowest in an array of temperatures.
*
* @param temperatures an array storing temperatures as ints.
* @return the lowest value from the the array of ints.
*/
public static int lowestTemperature(int[] temperatures) {
return getFilteredArray(temperatures).min().orElse(0);
}
/**
* Return the total number of missing days. That is days with
* -999 recorded as the temperatures.
*
* @param temperatures an array storing temperatures as ints.
* @return the number of -999s found.
*/
public static int numberMissing(int[] temperatures) {
return (int) IntStream.of(temperatures)
.filter(t -> t == -999)
.count();
}
}
方法getFilteredArray
完成所有工作。 它将数组转换为IntStream
,删除所有-999
值,然后返回流。 然后,您可以使用流运算符来计算平均值,总和,最小值,最大值等值。
public static double averageTemperature(int[] temperatures)
{
int sum = 0;
int count = 0;// number of valid values
for (int i = 0; i < temperatures.length; i++)
{
if(temperatures[i] > -999){ // before calculating check value
count ++;
sum += temperatures[i];
}
}
double average = count != 0 ? sum / count : -999 - 1; // preventing divide by zero
return average;
}
public static int lowestTemperature(int[] temperatures) {
if(temperatures == null || temperatures.length == 0)
return -999 - 1;
int min = temperatures[0];
for (int temperature : temperatures) {
if (temperature > -999 && temperature < min) {
min = temperature;
}
}
return min;
}
您只需要在每一步中检查该值是否为排除值,然后再以sum / average / min / max方法使用它即可。
例如:
public static double averageTemperature(int[] temperatures)
{
int sum = 0;
int count = 0;
for (int i = 0; i < temperatures.length; i++)
{
if (temperatures[i] != -999) {
sum += temperatures[i];
count++;
}
}
double average = sum / count;
return average;
}
对于最低温度,这就是我要做的:
public static int lowestTemperature(int[] temperatures) {
int min = 999;
for (int temperature : temperatures) {
if (temperature > -999 && temperature < min) {
min = temperature;
}
}
return min;
}
假设您的WeatherComputation类也将考虑999
的方式与考虑-999
(无效值)的方式相同。 原因很简单,如果一个月内只有负值怎么办? 然后,您的int min = 0
将是错误的。
至于平均温度:
public static double averageTemperature(int[] temperatures) {
int sum = 0, validTemperatureCounter = 0;
for (int temperature : temperatures) {
if (temperature > -999 && temperature < 999) {
validTemperatureCounter++;
sum += temperature;
}
}
return sum / (double)validTemperatureCounter;
}
我也随意忽略了999
的值。
为了好玩,有一个班轮:
public static double averageTemperatureOneLiner(int[] temperatures) {
return Arrays.stream(temperatures).filter(t -> t > -999 && t < 999).average().orElse(0);
}
public static int lowestTemperatureOneLiner(int[] temperatures) {
return Arrays.stream(temperatures).filter(t -> t > -999 && t < 999).min().orElse(0);
}
public static int highestTemperatureOneLiner(int[] temperatures) {
return Arrays.stream(temperatures).filter(t -> t > -999 && t < 999).max().orElse(0);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.