programacion - Java: número de límite entre mínimo y máximo
manual de programacion android pdf (6)
Deseo devolver el número siempre que esté dentro de un límite, de lo contrario devolverá el valor máximo o mínimo del límite. Puedo hacer esto con una combinación de Math.min
y Math.max
.
public int limit(int value) {
return Math.max(0, Math.min(value, 10));
}
Me pregunto si hay una función limit
o range
existente que estoy pasando por alto.
Bibliotecas de terceros son bienvenidas si son bastante comunes (p. Ej .: Commons o Guava)
A partir de la versión 21, Guava incluye Ints.constrainToRange()
(y métodos equivalentes para las otras primitivas). De las notas de la versión :
se agregaron los métodos
constrainToRange([type] value, [type] min, [type] max)
que limitan el valor dado al rango cerrado definido por los valoresmin
ymax
. Devuelven el valor en sí mismo si está dentro del rango, elmin
si está por debajo del rango y elmax
si está por encima del rango.
Copiado de https://.com/a/42968254/122441 por @ dimo414.
Lamentablemente, esta versión es bastante reciente a partir de julio de 2017, y en algunos proyectos (ver https://.com/a/40691831/122441 ), la guayaba había roto la compatibilidad con versiones anteriores que me obligaba a mantenerme en la versión 19 por ahora. ¡También estoy sorprendido de que ni Commons Lang ni Commons Math lo tengan! :(
La función Math.max(int a, int b)
se define como:
public static int min(int a, int b) {
return (a <= b) ? a : b;
}
De modo que puede hacer una combinación de las funciones max
Y min
. De la siguiente manera:
private static int MAX=10;
private static int MIN=0;
public int limit(int a) {
return (a > MAX) ? MAX : (a < MIN ? MIN: a );
}
Método genérico para cualquier clase que implemente Comparable
(incluido el Number
y sus subclases):
public static <T extends Comparable<? super T>> T limit(T o, T min, T max){
if (o.compareTo(min) < 0) return min;
if (o.compareTo(max) > 0) return max;
return o;
}
El único requisito es que todos los argumentos deben ser de la misma clase . Evita la posible pérdida de conversión de tipo. De hecho, es incorrecto comparar float
con double
de long
con int
etc. Por ejemplo (double) 0.1 != (float) 0.1
.
Uso:
double x = 13.000000001;
x = limit(x, 12.0, 13.0);
System.out.println("x = " + x); //x = 13.0
Desafortunadamente, es imposible cambiar el primer argumento directamente por el limit(x, 12.0, 13.0)
porque los tipos primitivos son inmutables.
No necesita una biblioteca externa para esto, pruebe este caso de prueba:
public class RandomNumber {
public static void main(String[] Args) {
System.out.println("random = " + randomInRange(5,10));
}
public static double randomInRange(double arg1, double arg2) {
double my_number = Math.ceil(Math.random() * (arg1 - arg2) + arg2);
return my_number;
}
}
OP solicita esta implementación en una biblioteca estándar:
int ensureRange(int value, int min, int max) {
return Math.min(Math.max(value, min), max);
}
boolean inRange(int value, int min, int max) {
return (value>= min) && (value<= max);
}
Una pena que la biblioteca estándar de matemáticas carezca de estos
Si está en Android, use MathUtils (en la biblioteca de soporte), tiene solo una función que específicamente hace esto llamado abrazadera.
Este método toma un valor numérico y asegura que se ajusta a un rango numérico dado. Si el número es menor que el mínimo requerido por el rango, se devolverá el mínimo del rango. Si el número es más alto que el máximo permitido por el rango, se devolverá el máximo del rango.