Тривиально написать функцию для определения минимального/максимального значения в массиве, например:
/**
*
* @param chars
* @return the max value in the array of chars
*/
private static int maxValue(char[] chars) {
int max = chars[0];
for (int ktr = 0; ktr < chars.length; ktr++) {
if (chars[ktr] > max) {
max = chars[ktr];
}
}
return max;
}
но разве это уже не сделано где-то?
Использование Commons Lang (для преобразования) + Collections (для минимизации/максимизации)
import java.util.Arrays;
import java.util.Collections;
import org.apache.commons.lang.ArrayUtils;
public class MinMaxValue {
public static void main(String[] args) {
char[] a = {'3', '5', '1', '4', '2'};
List b = Arrays.asList(ArrayUtils.toObject(a));
System.out.println(Collections.min(b));
System.out.println(Collections.max(b));
}
}
Обратите внимание, что Arrays.asList()
оборачивает базовый массив, поэтому он не должен занимать много памяти и не должен выполнять копирование элементов массива.
Вы можете просто использовать новый Java 8 `поток но вы должны работать с инт
.
В поток
метод в служебный класс массивы
дает вам IntStream
, на котором вы можете использовать мин метод. Вы также можете делать Макс
, сумма
, средний
,...
В getAsInt
метод используется, чтобы получить значение из OptionalInt
import java.util.Arrays;
public class Test {
public static void main(String[] args){
int[] tab = {12, 1, 21, 8};
int min = Arrays.stream(tab).min().getAsInt();
int max = Arrays.stream(tab).max().getAsInt();
System.out.println("Min = " + min);
System.out.println("Max = " + max)
}
}
==Обновления==
Если время выполнения очень важно, и вы хотите, чтобы пройти через данные только один раз можно использовать summaryStatistics()
метод такой
import java.util.Arrays;
import java.util.IntSummaryStatistics;
public class SOTest {
public static void main(String[] args){
int[] tab = {12, 1, 21, 8};
IntSummaryStatistics stat = Arrays.stream(tab).summaryStatistics();
int min = stat.getMin();
int max = stat.getMax();
System.out.println("Min = " + min);
System.out.println("Max = " + max);
}
}
Такой подход может дать более высокую производительность, чем классические петли, потому что summaryStatistics
метод операция по уменьшению и это позволяет распараллеливания.
В библиотеке Google гуава имеет min и Max методы в своих символов, целых чисел, длинных и т. д. классов.
Так что вы можете просто использовать:
Chars.min(myarray)
Никаких преобразований не требуется, и, вероятно, это's эффективно реализованы.
Да, это делается в классе Collections. Обратите внимание, что вам нужно будет вручную преобразовать массив примитивных символов char в Character[].
Небольшая демонстрация:
import java.util.*;
public class Main {
public static Character[] convert(char[] chars) {
Character[] copy = new Character[chars.length];
for(int i = 0; i < copy.length; i++) {
copy[i] = Character.valueOf(chars[i]);
}
return copy;
}
public static void main(String[] args) {
char[] a = {'3', '5', '1', '4', '2'};
Character[] b = convert(a);
System.out.println(Collections.max(Arrays.asList(b)));
}
}
import java.util.Arrays;
public class apples {
public static void main(String[] args) {
int a[] = {2,5,3,7,8};
Arrays.sort(a);
int min =a[0];
System.out.println(min);
int max= a[a.length-1];
System.out.println(max);
}
}
У меня есть маленький помощник класса во всех моих приложений с такими методами, как:
public static double arrayMax(double[] arr) {
double max = Double.NEGATIVE_INFINITY;
for(double cur: arr)
max = Math.max(max, cur);
return max;
}
Вы могли бы легко сделать это с метод IntStream
и Макс ()
.
Пример ###
public static int maxValue(final int[] intArray) {
return IntStream.range(0, intArray.length).map(i -> intArray[i]).max().getAsInt();
}
в диапазоне(0, класса intarray.длина)- получить поток с, как многие элементы, присутствующие в
класса intarray`.
Карта(я -> класса intarray[я])- карте каждого элемента потока к фактическому элементу
класса intarray`.
макс()- получить максимальный элемент этого потока, как
OptionalInt`.
getAsInt()
- развернуть OptionalInt
. (Вы можете также использовать здесь: Если(0)
на всякий случай `OptionalInt пуст.)
Решение с уменьшить()
:
int[] array = {23, 3, 56, 97, 42};
// directly print out
Arrays.stream(array).reduce((x, y) -> x > y ? x : y).ifPresent(System.out::println);
// get the result as an int
int res = Arrays.stream(array).reduce((x, y) -> x > y ? x : y).getAsInt();
System.out.println(res);
>>
97
97
В приведенном выше коде, уменьшить возвращает данные () в необязательный формат, который можно преобразовать в
intв
getAsInt()`.
Если мы хотим сравнить максимальное значение с определенным количеством, мы можем установить начальное значение в метод reduce()`:
int[] array = {23, 3, 56, 97, 42};
// e.g., compare with 100
int max = Arrays.stream(array).reduce(100, (x, y) -> x > y ? x : y);
System.out.println(max);
>>
100
В приведенном выше коде, когда уменьшить()` с удостоверением (начальное значение) в качестве первого параметра, то она возвращает данные в том же формате, с удостоверением. С этим свойством, мы можем применить это решение на другие массивы:
double[] array = {23.1, 3, 56.6, 97, 42};
double max = Arrays.stream(array).reduce(array[0], (x, y) -> x > y ? x : y);
System.out.println(max);
>>
97.0
public int getMin(int[] values){
int ret = values[0];
for(int i = 1; i < values.length; i++)
ret = Math.min(ret,values[i]);
return ret;
}
import java.util.Random;
public class Main {
public static void main(String[] args) {
int a[] = new int [100];
Random rnd = new Random ();
for (int i = 0; i< a.length; i++) {
a[i] = rnd.nextInt(99-0)+0;
System.out.println(a[i]);
}
int max = 0;
for (int i = 0; i < a.length; i++) {
a[i] = max;
for (int j = i+1; j<a.length; j++) {
if (a[j] > max) {
max = a[j];
}
}
}
System.out.println("Max element: " + max);
}
}
Пример с поплавком:
public static float getMaxFloat(float[] data) {
float[] copy = Arrays.copyOf(data, data.length);
Arrays.sort(copy);
return copy[data.length - 1];
}
public static float getMinFloat(float[] data) {
float[] copy = Arrays.copyOf(data, data.length);
Arrays.sort(copy);
return copy[0];
}
Вот решение, чтобы получить максимальное значение в примерно 99% работает (изменить 0,01, чтобы получить лучший результат):
public static double getMax(double[] vals){
final double[] max = {Double.NEGATIVE_INFINITY};
IntStream.of(new Random().ints((int) Math.ceil(Math.log(0.01) / Math.log(1.0 - (1.0/vals.length))),0,vals.length).toArray())
.forEach(r -> max[0] = (max[0] < vals[r])? vals[r]: max[0]);
return max[0];
}
(Не вполне серьезно)
Передать массив в метод, который сортирует ее с массивами.сортировать()так это только сортирует массив методом является использование затем устанавливает *мин* к
массив[0]и *максимум* к
массив[массив.длина-1]`.
Базовые способ получить мин/макс значение массива. Если вам нужен массив несортированный, вы можете создать копию или передать его в метод, который возвращает минимальное или максимальное. Если не отсортированный массив лучше, так как он выполняет быстрее в некоторых случаях.
public class MinMaxValueOfArray {
public static void main(String[] args) {
int[] A = {2, 4, 3, 5, 5};
Arrays.sort(A);
int min = A[0];
int max = A[A.length -1];
System.out.println("Min Value = " + min);
System.out.println("Max Value = " + max);
}
}