Encontrar el valor máximo / mínimo en una matriz de primitivas usando Java

Es trivial escribir una función para determinar el valor mínimo / máximo en una matriz, como por ejemplo:

/** * * @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  max) { max = chars[ktr]; } } return max; } 

pero, ¿no es esto ya hecho en alguna parte?

Uso de Commons Lang (para convertir) + Colecciones (a min / max)

 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)); } } 

Tenga en cuenta que Arrays.asList() envuelve la matriz subyacente, por lo que no debe Arrays.asList() demasiada memoria y no debe realizar una copia en los elementos de la matriz.

La biblioteca de Google Guava tiene métodos min y max en sus clases Chars, Ints, Longs, etc.

Entonces puedes simplemente usar:

 Chars.min(myarray) 

No se requieren conversiones y, presumiblemente, se implementa de manera eficiente.

Simplemente puede usar las nuevas Java 8 Stream , pero tiene que trabajar con int .

El método de stream de la clase de utilidad Arrays le proporciona un IntStream en el que puede usar el método min . También puedes hacer max , sum , average , …

El método getAsInt se usa para obtener el valor de 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) } } 

== ACTUALIZACIÓN ==

Si el tiempo de ejecución es importante y desea summaryStatistics() los datos solo una vez, puede usar el método summaryStatistics() como este

 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); } } 

Este enfoque puede proporcionar un mejor rendimiento que el ciclo clásico porque el método summaryStatistics es una operación de reducción y permite la paralelización.

Sí, está hecho en la clase de Colecciones . Tenga en cuenta que necesitará convertir su matriz de caracteres primitiva a un carácter [] manualmente.

Una breve demostración:

 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); } } 

Tengo una pequeña clase de ayuda en todas mis aplicaciones con métodos como:

 public static double arrayMax(double[] arr) { double max = Double.NEGATIVE_INFINITY; for(double cur: arr) max = Math.max(max, cur); return max; } 

Podrías hacerlo fácilmente con un IntStream y el método max() .

Ejemplo

 public static int maxValue(final int[] intArray) { return IntStream.range(0, intArray.length).map(i -> intArray[i]).max().getAsInt(); } 

Explicación

  1. range(0, intArray.length) – Para obtener una secuencia con tantos elementos como presente en intArray .

  2. map(i -> intArray[i])map(i -> intArray[i]) cada elemento de la secuencia a un elemento real de intArray .

  3. max() : obtenga el elemento máximo de esta secuencia como OptionalInt .

  4. getAsInt() – Desenvuelve el OptionalInt . (También podría usar aquí: orElse(0) , solo en caso de que OptionalInt esté vacío).

 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 max) { max = a[j]; } } } System.out.println("Max element: " + max); } } 

Pase la matriz a un método que lo Arrays.sort() con Arrays.sort() para que solo Arrays.sort() la matriz que está usando el método y luego establezca min para array[0] y max para array[array.length-1] .

Aquí hay una clase de utilidad que proporciona métodos min/max para tipos primitivos: Primitives.java

Ejemplo con float:

 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]; } 

La forma básica de obtener el valor mínimo / máximo de una matriz. Si necesita el conjunto no ordenado, puede crear una copia o pasarla a un método que devuelva el valor mínimo o máximo. De lo contrario, la matriz ordenada es mejor, ya que en algunos casos es más rápida.

 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); } } 
  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; } 

solución genérica *:

 public static  T getMax(T[] data) { T[] copy = Arrays.copyOf(data, data.length); Arrays.sort(copy); return copy[data.length - 1]; } public static  T getMin(T[] data) { T[] copy = Arrays.copyOf(data, data.length); Arrays.sort(copy); return copy[0]; } 

** tenga en cuenta posibles argumentos nulos pasados ​​:) (npx)

* ** para reemplazar primitivo T con el tipo deseado o usar Arrays.asList ()

ejemplo:

 public static long getMinMax(long[] data, boolean max) { // do checj if length > 0 or not null throw ex illegal state exception long[] copy = Arrays.copyOf(data, data.length); Arrays.sort(copy); return max ? copy[data.length - 1] : copy[0]; }