Java метод возвращающий макс/мин в новый массив
Задание Реализовать метод 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.
Вариант реализации без ранних возвратов, с использованием 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]