Pregunta Java: número de límite entre mínimo y máximo


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 existente limit o range función que estoy pasando por alto.
Bibliotecas de terceros son bienvenidas si son bastante comunes (p. Ej .: Commons o Guava)


32
2017-07-29 20:23


origen


Respuestas:


A partir de la versión 21, Guayaba incluye Ints.constrainToRange() (y métodos equivalentes para las otras primitivas). Desde el Notas de lanzamiento:

adicional constrainToRange([type] value, [type] min, [type] max) métodos que limitan el valor dado al rango cerrado definido por el min y max valores. Devuelven el valor en sí mismo si está dentro del rango, el min si está por debajo del rango y el max si está por encima del rango

Copiado de https://stackoverflow.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://stackoverflow.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! :(


5
2017-07-20 12:22



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


19
2018-03-31 08:59



los Math.max(int a, int b) la función se define como:

public static int min(int a, int b) {
    return (a <= b) ? a : b;
}

Entonces puedes hacer una combinación de max y min funciona 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 );
}

3
2018-03-31 09:04



Método genérico para cualquier clase implementando Comparable (incluso 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

Lamentablemente, es imposible cambiar el primer argumento directamente solo limit(x, 12.0, 13.0) porque los tipos primitivos son inmutables.


2
2018-05-26 11:44



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 determinado   rango numérico Si el número es menor que el mínimo requerido por   el rango, luego se devolverá el mínimo del rango. Si el   número es más alto que el máximo permitido por el rango, entonces el   se devolverá el máximo del rango.


0
2018-04-03 20:55



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

}


-2
2017-07-29 20:54