【问题标题】:comparing array elements with a return value from a method将数组元素与方法的返回值进行比较
【发布时间】:2019-10-15 12:00:52
【问题描述】:

我有一种方法可以根据用户输入的月份数组计算最小和最大降雨量。我的问题是我的方法返回最小值和最大值的数量,我需要它返回降雨量最高或最低的月份。我不确定如何将我的 min 和 max 方法与月份数组进行比较。我想如果我可以说在索引 5 处找到了最小值,那么也有办法提取月份数组的索引 5。

我尝试了多种类型的 for 循环和嵌套 for 循环,但似乎无法获得正确的月份。

public static void main(String[] args) {

    String[] months = {"January", "February", "March","April","May","June","July","August","September","October","November","December"};
    double[] rainfall = new double[months.length];

    Rainfall amazon = new Rainfall();

    //scanner to get user input
    Scanner scanner = new Scanner(System.in);

    //for loop to iterate through the months to get user input of rainfall each month
    for(int i = 0; i<rainfall.length; i++) {
        System.out.println("How much rainfall did you recieve, in inches, for the month of: " + months[i]);
        rainfall[i] = scanner.nextDouble();

        //while statement to reject negative numbers         
        while(rainfall[i] < 0) {
            System.out.println("You can not enter a negative number");
            System.out.println("How much rainfall did you recieve for the month of: " + months[i]);
            rainfall[i] = scanner.nextDouble();  
        }
    }

    System.out.println("total rainfall: " + amazon.getTotalRainfall(rainfall) + 
                       " average Rainfall: " + amazon.getAverageRainfall(rainfall) + 
                       " min: " + amazon.getMinRainfall(rainfall) + 
                       " max: " + amazon.getMaxRainfall(rainfall));

}

public double getMaxRainfall(double[] rainfall) {
    double max = rainfall[0];
    for(int i = 1; i < rainfall.length; i++)
        if(rainfall[i] > max) {
            max = rainfall[i];
        }
    return max;
}      

public double getMinRainfall(double[] rainfall) {
    double min = rainfall[0];
    for(int i = 1; i < rainfall.length; i++)
        if(rainfall[i] < min) {
            min = rainfall[i];
        }
    return min;
}

我需要知道降雨量最高和最低的月份

【问题讨论】:

  • 为什么没有方法返回具有最小或最大降雨量的月份的int index,而不是实际的最小或最大降雨量值。

标签: java arrays


【解决方案1】:

解决此问题的方法是跟踪最高降雨量的指数而不是数值。您现在遇到的问题是您有 2 个不同的数组,并且其中一个的值与另一个不相关。

为此,您可以执行以下操作:

    public int getMaxRainfallIndex(double[] rainfall) {
        int max = 0;
        for (int i = 1; i < rainfall.length; i++)
            if (rainfall[i] > rainfall[max]) {
                max = i;
            }
        return max;
    } 

然后您可以使用此返回值从原始 2 个数组中获取实际降雨量和月份。

然而,一种更简洁的方法是创建一个单独的类来存储两条信息,这样您就可以将包含两条信息的整个对象一起返回。这样您甚至不必担心保留 2 个单独的数组。

应该是这样的:

    public static void main(String[] args) {
        Rainfall[] rainfall = new Rainfall[12];
        //Do everything else
    }

    public class Rainfall {
        private String month;
        private double rainfall;

        //Constructor, Getters + Setters
    }

【讨论】:

  • 谢谢。这解决了我的问题。不过我确实有一个问题。我不完全理解该方法是如何工作的。它与我的 min 和 max 方法没有太大区别,但以某种方式返回索引。您是否有机会详细说明雨量[max] 如何为我提供最高雨量元素的索引。
  • @Ross 基本上,代码所做的是遍历数组的每个索引,并检查该位置的值是否高于当前最高值。如果这是真的,它将保存该值的索引。 Rainfall[max] 用于获取实际的当前最高值,因为我们存储的唯一内容是所述值的索引。这意味着如果当前最高索引处的值低于被检查的值,它将设置新的最高索引为该索引,依此类推。
  • @Ross 这意味着,当到达数组末尾时,所有值都已进行比较,并且对于每次比较,存储两个索引中较高的索引。然后在最后返回这意味着您只会从数组中获得最高的索引值。然后可以使用此返回值从原始 2 个数组中获取月份的实际值和降雨量的值。
【解决方案2】:

一种可能的解决方案是返回月份的索引,例如,您的 getMaxRainfall 方法应如下所示:

 public int getMaxRainfallIndex(double[] rainfall)
      {
        int maxIndex = 0;
        double max = rainfall[0];
              for(int i = 1; i < rainfall.length; i++)
                 if(rainfall[i] > max)
                    {
                     max = rainfall[i];
                     maxIndex = i;
                    }
              return maxIndex;
     }   

在您的main 中,您应该使用该索引来获取月份和降雨量:

int index = amazon.getMaxRainfallIndex(rainfall);
system.out.println("month of max rainfall: " + months[index]);
system.out.println("max rainfall: " + rainfall[index]);

【讨论】:

    【解决方案3】:

    您可以创建一个单独的class,而不是单独管理两个数组:

    public class RainfallByMonth {
        private double rainfall;
        private String month;
    
        // Getter/Setters here
    }
    

    在你的主要方法中:

    public static void main(String[] args) {
        RainfallByMonth[] rainfallByMonths = new RainfallByMonth[12];
        String[] months = new DateFormatSymbols().getMonths(); // array of months
    
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < rainfallByMonths.length; i++) {
            System.out.println("How much rainfall did you receive, in inches, for the month of: " + months[i]);
            rainfallByMonths[i].setMonth(months[i]);
            rainfallByMonths[i].setRainfall(scanner.nextDouble());
        }
        RainfallByMonth maxRainfall = getMaxRainfall(rainfallByMonths);
        // Now you can print the results here
    }
    

    按月计算最大降雨量:

    public static RainfallByMonth getMaxRainfall(RainfallByMonth[] rainfallByMonths) {
        RainfallByMonth maxRainfall = rainfallByMonths[0];
        for(int i = 1; i < rainfallByMonths.length; i++) {
            if(rainfallByMonths[i].getRainfall() > maxRainfall.getRainfall()) {
                maxRainfall = rainfallByMonths[i];
            }
        }
        return maxRainfall;
    }
    

    同样,min 的情况反之亦然(只是条件会有所不同)。这将更容易管理。

    【讨论】:

      【解决方案4】:
      public static void main(String[] args) {
            String[] months = {"January", "February", "March","April","May","June","July","August","September","October","November","December"};
            int[] weather = {10, -1, 7,44,33,6,22,54,89,21,8,51};
            int max = 0;
            int index= 0;
            for (int i=0;i<weather.length-1;i++  ){
                if (weather[i] > m){
                    max = weather[i];
                    index= i;
                } 
            }
            System.out.println(months[index]); 
      }
      

      查找最高月份的示例程序。 要找到最低月份的降雨量,请在 if 条件下使用小于符号

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多