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)
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 valeursmin
etmax
. Ils renvoient la valeur elle-même si elle est dans la plage, lemin
s'il est en dessous de la plage et lemax
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! :(
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
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é.
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 );
}
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.
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 .