web-dev-qa-db-fra.com

Java - nombre limite entre min et max

Je veux retourner le nombre tant qu'il tombe dans une limite, sinon retourner la valeur maximale ou minimale de la limite. Je peux le faire avec une combinaison de Math.min et Math.max.

public int limit(int value) {
    return Math.max(0, Math.min(value, 10));
}

Je me demande s'il existe une fonction limit ou range existante que je néglige.
Les bibliothèques tierces sont les bienvenues si elles sont assez courantes (par exemple: Commons ou Guava)

40
Sean Connolly

Depuis la version 21, Guava inclut Ints.constrainToRange() (et méthodes équivalentes pour les autres primitives). À partir de notes de version :

ajout de méthodes constrainToRange([type] value, [type] min, [type] max) qui contraignent la valeur donnée à la plage fermée définie par les valeurs min et max. Ils renvoient la valeur elle-même si elle est dans la plage, le min s'il est en dessous de la plage et le max s'il est au-dessus de la plage.

Copié de https://stackoverflow.com/a/42968254/122441 par @ dimo414.

Malheureusement, cette version est assez récente en juillet 2017, et dans certains projets (voir https://stackoverflow.com/a/40691831/122441 ) La goyave avait cassé la compatibilité descendante qui m'obligeait à rester sur la version 19 pour l'instant. Je suis également choqué que ni Commons Lang ni Commons Math ne l'aient! :(

9
Hendy Irawan

OP demande cette implémentation dans une bibliothèque standard:

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

Dommage que la bibliothèque mathématique standard manque

24
Barry Staes

Si vous êtes sur Android, utilisez MathUtils (dans la bibliothèque de support), il n'a qu'une seule fonction qui fait spécifiquement cela appelée pince.

Cette méthode prend une valeur numérique et garantit qu'elle s'inscrit dans une plage numérique donnée. Si le nombre est inférieur au minimum requis par la plage, le minimum de la plage sera retourné. Si le nombre est supérieur au maximum autorisé par la plage, le maximum de la plage sera renvoyé.

5
RJFares

La fonction Math.max(int a, int b) est définie comme:

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

Vous pouvez donc faire une combinaison des fonctions max et min comme suit:

private static int MAX=10;
private static int MIN=0;

public int limit(int a) {
    return (a > MAX) ? MAX : (a < MIN ? MIN: a );
}
4
Majid Laissi

Méthode générique pour toute classe implémentant Comparable (y compris Number et ses sous-classes):

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

La seule exigence est que tous les arguments doivent être de la même classe. Il empêche une éventuelle perte de conversion de type. En fait, il est incorrect de comparer float avec double de long avec int etc. Par exemple (double) 0.1 != (float) 0.1.

tilisation:

double x = 13.000000001;
x = limit(x, 12.0, 13.0);
System.out.println("x = " + x); //x = 13.0

Malheureusement, il est impossible de changer le premier argument directement par juste limit(x, 12.0, 13.0) car les types primitifs sont immuables.

3
Oleg Mikhailov

Je comprends que cela a été demandé pour Java. Dans le monde Android monde, il est courant d'utiliser Kotlin et Java combinés. Dans le cas où certains utilisateurs de Kotlin ont atteint ici (comme moi), alors ils peuvent utiliser coerceIn fonction d'extension:

Code Kotlin:

println(10.coerceIn(1, 100)) // 10
println(10.coerceIn(1..100)) // 10
println(0.coerceIn(1, 100)) // 1
println(500.coerceIn(1, 100)) // 100

En savoir plus sur officiel Documentation Kotlin .

1
HBB20