Java метод возвращающий макс/мин в новый массив

Рейтинг: -1Ответов: 2Опубликовано: 24.01.2023

Задание Реализовать метод getSpeedStatistic(), который принимает массив скоростей results и возвращает массив со статистикой в котором : первый элемент - минимальная скорость второй элемент - максимальная скорость Условие:
1. если массив пустой верни массив {0,0}
2. если входящий массив состоит из одного элемента его считать одновременно максимальной и минимальной скоростью Пока мысли в эту сторону

 public class SpeedStatistic {
      public static int[] getSpeedStatistic(int[] results) {
        
        int max = results[0];
        int min = results[0];
        int returnTest[] = new int[2];
        returnTest[0] = min;
        returnTest[1] = max;
        int i = 0;

        for (i = 0; i < results.length; i++) {
            if (results[i] > max) {
               max = results[i];
                
            }
            else if (results[i] < min) {
                min = results[i];
            }
        }
        {
            
        }
        return returnTest;
        
    }
}

Заранее благодарю за помощь

Ответы

▲ 2Принят

Ваша реализация не учитывает случай, когда входной массив пуст чтоб вернуть массив {0, 0}. Это можно добавить в начале метода, чтобы проверить, пуст ли входной массив, и вернуть {0, 0}. И еще ваша реализация не учитывает случай, когда входной массив имеет только один элемент, чтоб вернуть минимальное и максимальное значение одинаковыми. Вот пример того, как вы можете изменить свой код, чтобы учесть эти проблемы:

public class SpeedStatistic {
    public static int[] getSpeedStatistic(int[] results) {
        if (results.length == 0) {
            return new int[] {0, 0};
        } else if (results.length == 1) {
            return new int[] {results[0], results[0]};
        }

        int max = results[0];
        int min = results[0];
        int[] speedStatistics = new int[2];

        for (int i = 1; i < results.length; i++) {
            if (results[i] > max) {
                max = results[i];
            }
            if (results[i] < min) {
                min = results[i];
            }
        }
        speedStatistics[0] = min;
        speedStatistics[1] = max;
        return speedStatistics;
    }
}

В цикле for я начал с 1 вместо 0, чтобы избежать ненужного сравнения с min и max.

▲ 0

Вариант реализации без ранних возвратов, с использованием vararg синтаксиса для входного массива:

public static int[] getSpeedStatistic(int... speeds) {
    int min, max, n = speeds == null ? -1 : speeds.length;

    min = max = n < 1 ? 0 : speeds[0];

    for (int i = 1; i < n; i++) {
        int speed = speeds[i];
        if (speed < min) {
            min = speed;
        } else if (speed > max) {
            max = speed;
        }
    }
    return new int[] {min, max};
}

С использованием Stream API, а конкретно, метода IntStream::summaryStatistics, логику кода можно значительно упростить за счёт класса для сбора статистики IntSummaryStatistics:

public static int[] getSpeedStatistic(int... speeds) {
    if (speeds == null || speeds.length < 1) {
        return new int[] {0, 0};
    }
    IntSummaryStatistics stats = Arrays.stream(speeds).summaryStatistics();
    return new int[] {stats.getMin(), stats.getMax()};
}

Тесты:

System.out.println(Arrays.toString(getSpeedStatistic()));
System.out.println(Arrays.toString(getSpeedStatistic(null)));
System.out.println(Arrays.toString(getSpeedStatistic(3)));
System.out.println(Arrays.toString(getSpeedStatistic(7, 5, 9, 8, 10, 4)));

Результаты:

[0, 0]
[0, 0]
[3, 3]
[4, 10]