Как найти медианное значение с помощью API потока Java:
Например, у меня есть следующий массив int []arr = {0,1,2,4,6,5,3};
Есть ли способ и как лучше всего найти медианное значение с помощью Java Stream API;
int findMedian() {
int []arr = {0,1,2,4,6,5,3};
IntStream.of(arr).sorted() // what I have to do here
return 0;
}
А как вы думаете, если я перейду на параллельный поток для большого массива, он будет быстрее или нет? Сортировка будет параллельной?
Нет, это пример, а что, если нам нужно для значений 1 м? Сортировка будет производиться параллельно?
Вам почти наверняка будет лучше просто вызвать напрямую в Arrays.sort
или Arrays.parallelSort
.
Я предлагаю вам передать массив в findMedian
(и, поскольку он не имеет доступа ни к каким полям, сделайте его статическим). Затем вы можете отсортировать его, преобразовать обратно в массив и вернуть элемент половинной длины. Нравиться,
static int findMedian(int[] arr) {
return IntStream.of(arr).sorted().toArray()[arr.length / 2]);
}
или, skip
, что много элементов и limit
, это первый результат. Нравиться,
return IntStream.of(arr).sorted().skip(arr.length / 2).limit(1);
Хорошо, как вы думаете, если я перейду на параллельный поток, он будет быстрее или нет?
@ AhmadAl-Kurdi Для семи ценностей? Я думаю, медленнее. Есть накладные расходы на запуск потоков.
Нет, это пример, а что, если нам нужно для значений 1 м? Сортировка будет производиться параллельно?
@ AhmadAl-Kurdi, если у вас действительно большой массив, используйте Arrays.parallelSort
для сортировки этого массива вместо создания нескольких копий с помощью Stream API.
В особенности для небольшого массива накладные расходы, связанные с параллельным распределением вашей работы по нескольким потокам, вероятно, значительно перевешивают преимущества. На практике вы всегда должны тестировать использование
parallelStream()
, чтобы убедиться, что это именно то, что вам нужно.