打印数组元素的索引:Java

3
我正在编写一个Java程序,获取每个月的降雨量。它运行得很完美,但我只需要知道如何获取一个月份的索引 - 例如,有一个输出语句:降雨最少的月份是1,降雨量为1.6英寸。如何获取'1',也就是最低月份的索引?我可以很好地获得实际的最低降雨量数据,但无法获得索引。
我尝试过months[n-1],但我仍然收到错误消息“非静态变量months不能从静态上下文中引用”。
任何帮助都会很棒。谢谢。
// 编辑
这是代码。我尝试了一些静态的调整,但那只给我带来了更多的错误?所以我被困在了底部的months[n]部分。
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");

}

/// 编辑 #2 - 好的,所以上面的代码在获取每个月的用户输入时有效。现在我正在尝试设置数组thisYear中的值(即删除用户输入)。计算不再起作用了。我做错了什么?

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.");
    }
  }

1
“非静态”错误可能是因为您将月份数组声明为应用程序类的字段并从“main”方法中引用它。在数组前加上“static”即可消除该错误。 - Ray Toal
如果您能提供源代码,那就太好了。看起来您走在正确的道路上,但正如@Ray所提到的,您需要处理静态变量。 - Garbage
@RayToal - 我已经尝试过使用static进行调整,但似乎仍然无法使其正常工作。您能否从我发布的代码中看出我做错了什么?谢谢。 - SeekingCharlie
当然。months必须从r中获取的问题,我已经发布了一个带有工作代码的答案,并提出了一些其他建议。我知道现在已经很晚了,所以如果早期的答案是正确的,可以自由选择接受。 - Ray Toal
3个回答

1

非静态变量months无法从静态上下文中引用

当您从静态成员或块访问非静态成员时,会出现此编译时错误,例如:

class Test{ private int i=0; public static void main(String[] args){ i=1; //这将导致该错误。 } } 我认为我们可以从稍微不同的角度来看待这个问题。

class RainFall{
     private double minFall;
     private double maxFall;
    public void setMinFall(double minFall) {
        this.minFall = minFall;
    }
    public double getMinFall() {
        return minFall;
    }
    public void setMaxFall(double maxFall) {
        this.maxFall = maxFall;
    }
    public double getMaxFall() {
        return maxFall;
    }

}
public class RainFallMeasure{
        public static void main(String[] args) {
     Map<Integer,RainFall> rainFalls=new HashMap<Integer,RainFall>();
     RainFall janRainFall = new RainFall();
     janRainFall.setMinFall(1);
     janRainFall.setMaxFall(1.6);
     rainFalls.put(Calendar.JANUARY, janRainFall);
     RainFall febRainFall = new RainFall();
     ...
     rainFalls.put(Calendar.FEBRUARY, febRainFall);
    }
}

0

你可以使用这个方法来查找索引

public class TEST {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        double temp[] = {1, 5, 3};
        System.out.print(getIndex(temp,3));
    }
      //takes 2 parameters one is array and other is the value for which you want find index
    public static int getIndex(double[] temp, int value)
    {
        int i ;
        for( i= 0; i< temp.length; i++)
        {
            if(temp[i] == value)
            {
                return i;           
            }
        }
        return -1;
    }
}

在传递参数时,您可以使用您的月份代替临时变量。


0

另一种方法是重新设计您的应用程序,使方法计算降雨量最高和最低的月份的索引,而不是计算降雨量本身。这个想法是,一旦您有了索引,您总是可以按需查找实际值。

我已经为您修补了代码,以便它只做这件事,并且还纠正了一些“静态”错误。

您可以使用此工作应用程序并根据需要进行调整:

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 enterMonthData() {
        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;
    }

    /**
     * Returns the index of the month with the highest rainfall.
     */
    public int getHighestMonth() {
        int highest = 0;
        for (int i = 0; i < 12; i++) {
            if (months[i] > months[highest]) {
                highest = i;
            }
        }
        return highest;
    }

    /**
     * Returns the index of the month with the lowest rainfall.
     */
    public int getLowestMonth() {
        int lowest = 0;
        for (int i = 0; i < 12; i++) {
            if (months[i] < months[lowest]) {
                lowest = i;
            }
        }
        return lowest;
    }

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

附录

为了回答你的后续问题,你需要为你的Rainfall对象提供一个构造函数,该构造函数接受降雨数据并将这些数据存储在对象的字段中。这就是你想要的:

public class Rainfall {

    private double[] amounts;

    public Rainfall(double[] amounts) {
        this.amounts = amounts;
    }

    double getTotalRain() {
        double total = 0.0;
        for (int i = 0; i < amounts.length; i++) {
            total += amounts[i];
        }
        return total;
    }

    double getAverageRain() {
        return getTotalRain() / amounts.length;
    }

    int getHighestMonth() {
        int high = 0;
        for (int i = 0; i < amounts.length; i++) {
            if (amounts[i] > amounts[high]) {
                high = i;
            }
        }
        return high;
    }

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

    /**
     * Returns the total rain the given month number.  Month numbers
     * start at 0, not 1.
     */
    double getRainForMonth(int monthNumber) {
        return amounts[monthNumber];
    }

    public static void main(String[] args) {

        // Sample data for testing
        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, starting at 0
        int low;     // The low month, stating at 0

        // Create a RainFall object initialized with amounts from above 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.getRainForMonth(high) + " inches.");
        low = r.getLowestMonth();
        System.out.println("The month with the lowest amount of rain is " + (low + 1)
                + " with " + r.getRainForMonth(low) + " inches.");
    }
}

天啊,这样就清楚多了。非常感谢你!! - SeekingCharlie
我现在正在尝试删除所有用户输入,并在数组中指定值。你能看出我哪里做错了吗? - SeekingCharlie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接