1

I am writing a java program that gets the rainfall for each month. It's working perfectly, but I just need to know how to get the index of a month - for example, there is an output statement: The month with the lowest amount of rain is 1 with 1.6 inches. How do I get the '1', which is the index of the lowest month? I can get the actual lowest rainfall figure fine, but not the index.

I have tried months[n-1], however I am still getting an error "non-static variable months cannot be referenced from a static context".

Any help would be great. Thanks.

// EDIT

Here is the code. I tried to play around with the static, but that just gave me more errors? So the months[n] part at the bottom is where I'm stuck.

import java.util.*;

public class Rainfall {

Scanner in=new Scanner(System.in);
 int month=12;
 double total=0;
 double average;
     double months[];

public Rainfall()
{
    months=new double[12];
}

public void setMonths()
{
     for(int n=1; n<=month; n++ )
     {
     System.out.print("Enter the rainfall (in inches) for month #"+n+": ");
     months[n-1] = in.nextDouble();

     //Input Validation - Cannot accept a negative number
        while (months[n-1] < 0)
        {
         System.out.print("Rainfall must be at least 0. Please enter a new value.");
         months[n-1] = in.nextDouble();
        }
     }
}

public double getTotalRainFall()
{
    total = 0;
    for(int i=0; i<12;i++)
    {
        total=total+months[i];
    }
    return total;
}

public double getAverageRainFall()
{
    average = total/12;
    return average;
}

public double getHighestMonth()
{
    double highest=0;
    for ( int i = 0; i < 12; i++)
    {
        if ( months[i] > highest)
        {
            highest = months[i] ;
        }
    }
    return highest;
}

public double getLowestMonth()
{
    double lowest = Double.MAX_VALUE;
    for ( int n = 0; n < month; n++)
        {
            if (months[n] < lowest )
            {
                lowest = months[n];
            }
        }
        return lowest;
}

public static void main(String[]args)
{
    Rainfall r =new Rainfall();
    r.setMonths();
    System.out.println("The total rainfall for this year is " + r.getTotalRainFall());
            System.out.println("The average rainfall for this year is " + r.getAverageRainFall());
    System.out.println("The month with the highest amount of rain is " + months[n] + "with" + r.getHighestMonth() "inches");
            System.out.println("The month with the lowest amount of rain is  " + months[n] "with" + r.getLowestMonth() "inches");

}

/// EDIT #2 - Ok, so the above code works when getting user input for each month. Now I'm trying to set the values in the array thisYear (i.e. remove user input). The calculations no longer work. What have I done wrong?

package Rainfall;

public class Rainfall {

int month = 12;
double total = 0;
double average; 
double getRainAt[];

 public Rainfall() {
    getRainAt = new double[12];
}

    double getTotalRain() {
    for (int i = 0; i < 12; i++) {
        total = total + getRainAt[i];
    }
    return total;
}

   double getAverageRain() {
    average = total / 12;
    return average;
}

int getHighestMonth() {
    int high = 0;
    for (int i = 0; i < 12; i++) {
        if (getRainAt[i] > getRainAt[high]) {
            high = i;
        }
    }
    return high;
}

int getLowestMonth() {
    int low = 0;
    for (int i = 0; i < 12; i++) {
        if (getRainAt[i] < getRainAt[low]) {
            low = i;
        }
    }
    return low;
}


public static void main(String[] args) {
   // Create an array of rainfall figures. 

  double thisYear[] = {1.6, 2.1, 1.7, 3.5, 2.6, 3.7,
                       3.9, 2.6, 2.9, 4.3, 2.4, 3.7 };

  int high;      // The high month
  int low;       // The low month

  // Create a RainFall object initialized with the figures
  // stored in the thisYear array.
  Rainfall r = new Rainfall(thisYear);
  // Display the statistics.
  System.out.println("The total rainfall for this year is " +
                     r.getTotalRain());
  System.out.println("The average rainfall for this year is " +
                     r.getAverageRain());
  high = r.getHighestMonth();
  System.out.println("The month with the highest amount of rain " +
                     "is " + (high+1) + " with " + r.getRainAt(high) +
                     " inches.");
  low = r.getLowestMonth();
  System.out.println("The month with the lowest amount of rain " +
                     "is " + (low+1) + " with " + r.getRainAt(low) +
                     " inches.");
    }
  }
iamgod
  • 63
  • 2
  • 8
  • `r.getRainAt[high]` , use `[]` not `()`. – AllTooSir Jun 25 '13 at 05:30
  • 1
    Some points: don't use arrays use lists, refactor your `main()` in a separate class with only the `main` method (this will help you understand what's wrong), take a look at `Collections.min` / `Collections.max`. –  Jun 25 '13 at 05:31

2 Answers2

1

You can use like this.

double getIndex(double value) {
    Arrays.asList(getRainAt).indexOf(value);
}
stinepike
  • 54,068
  • 14
  • 92
  • 112
0

One solution, using a Map and an enum for months:

package com.stackoverflow.so17289710;

import java.util.*;

public class Rainfall {

    public static enum Month {
        JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER;
    }

    private final Map<Month, Double> months;

    public Rainfall()
    {
        this.months = new TreeMap<Month, Double>(); // treeMap for order
        for (final Month month : Month.values()) {
            this.months.put(month, 0.0);
        }
    }

    public void setUpMonths()
    {
        final Scanner in = new Scanner(System.in);
        try {
            for (final Map.Entry<Month, Double> entry : this.months.entrySet()) {
                do {
                    System.out.print("Enter the rainfall (in inches) for " + entry.getKey().name() + " (>=0): ");
                    entry.setValue(in.nextDouble()); // TODO validation (handle text input, ...)

                    // Input Validation - Cannot accept a negative number
                } while (Math.signum(entry.getValue()) == -1);
            }
        } finally {
            in.close();
        }
    }

    public double computeTotalRainFall()
    {
        double total = 0.0;
        for (final Map.Entry<Month, Double> entry : this.months.entrySet()) {
            total += entry.getValue();
        }
        return total;
    }

    public double computeAverageRainFall()
    {
        return this.computeTotalRainFall() / (1.0 * this.months.size());
    }

    public Map.Entry<Month, Double> computeHighestMonth()
    {
        Map.Entry<Month, Double> highest = null;
        for (final Map.Entry<Month, Double> entry : this.months.entrySet()) {
            if (highest == null || highest.getValue() < entry.getValue()) {
                highest = entry;
            }
        }
        return highest;
    }

    public Map.Entry<Month, Double> computeLowestMonth()
    {
        Map.Entry<Month, Double> lowest = null; 
        for (final Map.Entry<Month, Double> entry : this.months.entrySet()) {
            if (lowest == null || lowest.getValue() > entry.getValue()) {
                lowest = entry;
            }
        }
        return lowest;
    }
}

.

package com.stackoverflow.so17289710;

import com.stackoverflow.so17289710.Rainfall.Month;

import java.util.Map.Entry;

public class App {
    public static void main(final String[] args)
    {
        // TODO: formatting of doubles
        final Rainfall r =new Rainfall();
        r.setUpMonths();
        System.out.println("The total rainfall for this year is " + r.computeTotalRainFall());
        System.out.println("The average rainfall for this year is " + r.computeAverageRainFall());
        final Entry<Month, Double> lowestMonth = r.computeLowestMonth();
        System.out.println("The month with the highest amount of rain is " + lowestMonth.getKey() + " with " + lowestMonth.getValue() + " inches");
        final Entry<Month, Double> highestMonth = r.computeHighestMonth();
        System.out.println("The month with the lowest amount of rain is " + highestMonth.getKey() + " with " + highestMonth.getValue() + " inches");
    }
}