【问题标题】:If statement returns index of only the first value meeting condition? Java如果语句仅返回满足条件的第一个值的索引?爪哇
【发布时间】:2020-03-22 03:08:06
【问题描述】:

我的任务是编写一个包含非空数组“温度”的类,该数组存储一年中 365 天的温度。

我的任务是编写一个返回一年中温度最低的日子的方法。 例如,如果数组temperatures = {0,0,-10,-10,0,......,0}。对应的结果应该是 3,尽管有两个相同的值与集合的最低温度,因为第 3 天(第二个索引)是第一个具有最低值的。

我已经正确地写出了代码,但是我不确定为什么在我的第二个 If 语句中,它只返回具有最低值的那一天,而不是所有具有最低值的日子。

这是我的代码

        public static int coldest(double[] temperatures) {
    double minimum = temperatures[0];
    for (double temp : temperatures) {
        if (temp < minimum) {
            minimum = temp;
        }
    }
    for (int i = 0; i < temperatures.length; i++) {
        if (Math.abs(minimum - temperatures[i]) < 0.000000001) {
            return i + 1;
        }
    }
    return -1;
}

例如,如果我定义 double[] a = {-5,2,-5,2,-5,......2};,肯定在第二个 For 循环内,它会返回 1,3,5,7...,因为所有这些天都满足 If 条件,而不仅仅是 1。

如果我没有把我的问题写得很清楚,我很抱歉,这是我第一次在这里提问。

【问题讨论】:

  • 因为一旦到达return语句,函数就完成了。

标签: java for-loop if-statement


【解决方案1】:

我的任务是编写一个返回年份的方法 最低温度。

如果是这样,你的逻辑是有缺陷的,例如以下条件没有任何意义:

if (Math.abs(minimum - temperatures[i]) < 0.000000001)

按如下方式进行:

public class Main {
    public static void main(String args[]) {
        System.out.println(coldest(new double[] { 0, 0, -10, -10, 0, 0 }));
    }

    public static int coldest(double[] temperatures) {
        if (temperatures == null || temperatures.length == 0) {
            return -1;
        }
        double minimum = temperatures[0];
        for (double temp : temperatures) {
            if (temp < minimum) {
                minimum = temp;
            }
        }
        for (int i = 0; i < temperatures.length; i++) {
            if (minimum == temperatures[i]) {
                return i + 1;
            }
        }
        return -1;
    }
}

输出:

3

如果您的要求是获取所有最低温度天的列表,则需要返回一个数组而不是单个值,例如

import java.util.Arrays;

public class Main {
    public static void main(String args[]) {
        // Test
        System.out.println(Arrays.toString(coldestDays(new double[] { 0, 0, -10, -10, 0, 0 })));
    }

    public static int[] coldestDays(double[] temperatures) {
        if (temperatures == null || temperatures.length == 0) {
            return new int[0];
        }
        double minimum = temperatures[0];
        int count = 0;// To store the required size of the array
        for (double temp : temperatures) {
            if (temp < minimum) {
                minimum = temp;
            }
        }
        for (double t : temperatures) {
            if (t == minimum) {
                count++;
            }
        }
        int[] minTemps = new int[count];// Create the array
        int index = 0;
        for (int i = 0; i < temperatures.length; i++) {
            if (minimum == temperatures[i]) {
                minTemps[index++] = i + 1;// Store the (index +1 ) of the minimum temperatures
            }
        }
        return minTemps;
    }
}

输出:

[3, 4]

我不确定您是否已达到使用 Java 集合的水平。如果是,您可以使用ArrayList,在这种情况下,您无需先找到最低温度的天数来创建适当大小的数组。

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String args[]) {
        // Test
        System.out.println(coldestDays(new double[] { 0, 0, -10, -10, 0, 0 }));
    }

    public static List<Integer> coldestDays(double[] temperatures) {
        if (temperatures == null || temperatures.length == 0) {
            return new ArrayList<Integer>();
        }
        double minimum = temperatures[0];
        List<Integer> days = new ArrayList<Integer>();
        for (double temp : temperatures) {
            if (temp < minimum) {
                minimum = temp;
            }
        }

        for (int i = 0; i < temperatures.length; i++) {
            if (minimum == temperatures[i]) {
                days.add(i + 1);// Store the (index +1 )of the minimum temperatures
            }
        }
        return days;
    }
}

输出:

[3, 4]

【讨论】:

    【解决方案2】:

    我认为您可能对 `return' 语句的实际作用感到困惑。

    它的主要动作是“退出这个函数”,或者更具体地说,“退出这个函数的当前调用”。从那里,应该很清楚你只能这样做一次。一旦你退出了,你就退出了。

    它的次要动作是提供函数调用的值,即要“返回”给调用者的值。该函数被声明为返回一些“int”值(int coldest(...)),return 语句提供该(单个)int 值。

    【讨论】:

      【解决方案3】:

      原因是第二个if 语句中的return 打破了您的for 循环。我建议您采用这种解决方案。您可以返回Integer 值列表,而不是返回一个int 值:

      public static List<Integer> coldest(double[] temperatures) {
          double minimum = temperatures[0];
          List<Integer> arrayList = new ArrayList<>();
          for (double temp : temperatures) {
              if (temp < minimum) {
                  minimum = temp;
              }
          }
          for (int i = 0; i < temperatures.length; i++) {
              if (Math.abs(minimum - temperatures[i]) < 0.000000001) {
                  arrayList.add((i + 1));
              }
          }
          return arrayList;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-31
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多