Если оператор возвращает индекс только первого значения, удовлетворяющего условию? Java - PullRequest
0 голосов
/ 22 марта 2020

Мне было поручено написать класс с непустым массивом 'температура', в котором хранятся температуры 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};, конечно, во втором Для L oop, он вернется 1,3,5,7 ... так как все эти дни удовлетворяют критериям If, а не просто 1.

Прошу прощения, если я не очень четко написал свой вопрос, я впервые задаю вопрос здесь.

Ответы [ 3 ]

0 голосов
/ 22 марта 2020

Причина - return во втором if утверждении нарушает вашу for l oop. Я предлагаю вам такое решение. Вместо возврата одного значения int можно вернуть список значений Integer:

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;
}
0 голосов
/ 22 марта 2020

Моя задача - написать метод, возвращающий день года с самой низкой температурой.

Если это так, ваша логика c имеет недостатки, например, следующее условие не имеет никакого смысла:

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]
0 голосов
/ 22 марта 2020

Я думаю, вы можете быть озадачены тем, что фактически делает оператор return.

Его основное действие - «выход из этой функции», или, более конкретно, «выход из текущего вызова этой функции». , Из этого должно быть достаточно ясно, что вы можете сделать это только один раз. Как только вы вышли, вы вышли.

Его второстепенное действие заключается в предоставлении значения вызова функции, т. Е. Того, какое значение должно быть «возвращено» вызывающей стороне. Объявлена ​​функция для возврата некоторого значения int (int coldest(...)), а оператор return предоставляет это (единственное) значение int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...