Naro Naro - 25 days ago 6
Java Question

Trying to get the correct month to display with highest and lowest value

I am able to get the correct highest and lowest value but it is not putting the correct month with that value. Below is the RainFall Class and Rainfall program. Here are the values I put in (2.1, 1.7, 3.5, 2.6, 3.7, 1.6, 3.9, 2.6, 2.9, 4.3, 2.4, 3.7). I will show the results at the end.

/**
* RainFall class
*/

public class RainFall
{
private double[] rainValue; //Rain entered by user
private int months = 12; //Number of months in a year
/**
* Constructor
*/

public RainFall(double[] rainArray)
{
rainValue = rainArray;
}
/**
* The getRainSum method returns the sum of all
* rainfall for the year.
*/
public double getRainSum()
{
double sum = 0.0; //Accumulator

//Get sum of all values in the rain array.
for (double value : rainValue)
sum += value;

return sum;


}

/**
*The get RainAverage method returns the monthly
*rainfall average.
*/
public double getRainAverage()
{
return getRainSum() / months;
}

/**
* The getRainHighest method returns the highest
* rainfall month for the year.
*/
public double getRainHighest()
{
double highest = rainValue[0]; //Get value at index 0

//Search array for the highest value.
for(int index = 1; index < rainValue.length; index++)
{
if (rainValue[index] > highest)
highest = rainValue[index];
}
return highest; // return highest value
}

/**
* The getRainLowest method returns the lowest
* rainfall month for the year
*/
public double getRainLowest()
{
double lowest = rainValue[0]; //Get value at index 0

//Search array for the lowest value.
for (int index = 1; index < rainValue.length; index++)
{
if (rainValue[index] < lowest)
lowest = rainValue[index];
}
return lowest; //return lowest value
}

}


Test Program:

/**
* This program demonstrates the RainFall class.
*/
public class RainTest {

public static void main(String[] args)
{

String[] months = { "January", "February", "March",
"April", "May", "June", "July",
"August", "September", "October",
"November", "December" }; //Months of the year

//Crate an array to hold the rain values
double[] rain = new double[12];

//Create a Scanner object for keyboard input.
Scanner keyboard = new Scanner(System.in);
//Get rain values and store them
//in the rain array
for (int index = 0; index < months.length; index++)
{
System.out.print("Enter rain value for " + months[(index)] + ":");
rain[index] = keyboard.nextDouble();
if (rain[index] <0)
{
System.out.println("You can not use a negative number.\n");
index--;
}

}

/**
* Create a RainFall object, passing the rain array
* as an argument to the constructor.
*/
RainFall myRainFall = new RainFall(rain);

//Display total rainfall
System.out.println("The total rainfall for the year is: " + myRainFall.getRainSum());

//Display average rainfall
System.out.println("The average rainfall for the year is: " + myRainFall.getRainAverage());

//Display highest rainfall

System.out.println("The month with the highest rainfall was " + months[(int) myRainFall.getRainHighest() -1] +" with "
+ myRainFall.getRainHighest() +" inches.");

//Display lowest rainfall

System.out.println("The month with the lowest rainfall was " + months[(int) myRainFall.getRainLowest() -1] + " with "
+ myRainFall.getRainLowest() +" inches.");

}

}


Here are the results:

Enter rain value for January:2.1
Enter rain value for February:1.7
Enter rain value for March:3.5
Enter rain value for April:2.6
Enter rain value for May:3.7
Enter rain value for June:1.6
Enter rain value for July:3.9
Enter rain value for August:2.6
Enter rain value for September:2.9
Enter rain value for October:4.3
Enter rain value for November:2.4
Enter rain value for December:3.7
The total rainfall for the year is: 35.0
The average rainfall for the year is: 2.9166666666666665
The month with the highest rainfall was April with 4.3 inches.
The month with the lowest rainfall was January with 1.6 inches.


As you can see the highest month should be October not April and the lowest should be June not January.

Thank you in advance for any help you can provide.

Answer

Your problem is that getRainLowest returns the amount of rainfall in the lowest month, not the index of the lowest month. Thus, the following expression makes no sense:

months[(int) myRainFall.getRainLowest() -1]

You basically need to define a different method which gives the index of the lowest month rather than the amount of rainfall for the lowest month. The same hold for the highest month.