Es trivial escribir una función para determinar el valor mínimo / máximo en una matriz, como:
/**
*
* @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;
}
pero ¿no está esto ya hecho en alguna parte?
java
arrays
algorithm
frameworks
Nick Heiner
fuente
fuente
Collections.max(Arrays.asList())
.Respuestas:
Usando Commons Lang (para convertir) + Colecciones (a min / max)
Tenga en cuenta que
Arrays.asList()
envuelve la matriz subyacente, por lo que no debe consumir demasiada memoria y no debe realizar una copia en los elementos de la matriz.fuente
ArrayUtils
Arrays.asList()
debería estar bien, peroArrayUtils.toObject()
copiará cada elemento dea
a una nueva matriz deCharacter
.Arrays.asList(a)
no funciona No puede hacer una lista de primitivas (List<char>
en este caso). Primero necesita convertir los valores primitivos en objetos y por esoArrayUtils.toObject
se usa.Simplemente puede usar los nuevos Java 8
Stream
s pero tiene que trabajar con ellosint
.El
stream
método de la clase de utilidadArrays
le proporciona un método paraIntStream
usar elmin
método. También se puede hacermax
,sum
,average
, ...El
getAsInt
método se utiliza para obtener el valor deOptionalInt
== ACTUALIZACIÓN ==
Si el tiempo de ejecución es importante y desea revisar los datos solo una vez, puede usar el
summaryStatistics()
método de esta maneraEste enfoque puede proporcionar un mejor rendimiento que el bucle clásico porque el
summaryStatistics
método es una operación de reducción y permite la paralelización.fuente
La biblioteca Google Guava tiene métodos min y max en sus clases Chars, Ints, Longs, etc.
Entonces simplemente puedes usar:
No se requieren conversiones y presumiblemente se implementa de manera eficiente.
fuente
Sí, se hace en la clase Colecciones . Tenga en cuenta que deberá convertir su primitiva matriz de caracteres a un carácter [] manualmente.
Una breve demostración:
fuente
char []
aCharacter []
solo para determinar el máximo es bastante ineficiente; mejor cree una clase de utilidad con métodos estáticos para cada tipo primitivo similar ajava.util.Arrays
: java.sun.com/javase/6/docs/api/java/util/Arrays.htmlCharacter.valueOf(chars[i])
lugar denew Character(chars[i])
por razones de rendimiento: java.sun.com/javase/6/docs/api/java/lang/…fuente
Tengo una pequeña clase auxiliar en todas mis aplicaciones con métodos como:
fuente
Podrías hacerlo fácilmente con un
IntStream
y elmax()
método.Ejemplo
Explicación
range(0, intArray.length)
- Para obtener una secuencia con tantos elementos como presente en elintArray
.map(i -> intArray[i])
- Asigna cada elemento de la secuencia a un elemento real de laintArray
.max()
- Obtenga el elemento máximo de esta secuencia comoOptionalInt
.getAsInt()
- Desenvuelve elOptionalInt
. (También puede usar aquí:orElse(0)
en caso de queOptionalInt
esté vacío).fuente
Aquí hay una clase de utilidad que proporciona
min/max
métodos para tipos primitivos: Primitives.javafuente
fuente
fuente
int
pero la pregunta es pedir valores primitivosint, long, char, byte....
Una solución con
reduce()
:En el código anterior,
reduce()
devuelve datos enOptional
formato, que puede convertirint
porgetAsInt()
.Si queremos comparar el valor máximo con un cierto número, podemos establecer un valor inicial en
reduce()
:En el código anterior, cuando
reduce()
tiene una identidad (valor de inicio) como primer parámetro, devuelve datos en el mismo formato que la identidad. Con esta propiedad, podemos aplicar esta solución a otras matrices:fuente
Ejemplo con flotador:
fuente
Aquí hay una solución para obtener el valor máximo en aproximadamente el 99% de las ejecuciones (cambie el 0.01 para obtener un mejor resultado):
(No completamente serio)
fuente
Pase la matriz a un método que la clasifique
Arrays.sort()
para que solo clasifique la matriz que está utilizando el método y luego establezca min toarray[0]
y max toarray[array.length-1]
.fuente
La forma básica de obtener el valor mínimo / máximo de una matriz. Si necesita la matriz sin clasificar, puede crear una copia o pasarla a un método que devuelva el mínimo o el máximo. Si no, la matriz ordenada es mejor ya que en algunos casos funciona más rápido.
fuente