数値が制限内に収まる限り数値を返します。それ以外の場合は、制限の最大値または最小値を返します。 Math.min
とMath.max
の組み合わせでこれを行うことができます。
public int limit(int value) {
return Math.max(0, Math.min(value, 10));
}
私が見落としている既存のlimit
またはrange
関数があるかどうか疑問に思っています。
サードパーティのライブラリがかなり一般的であれば歓迎します(例:コモンズまたはグアバ)
バージョン21の時点で、 Guava には Ints.constrainToRange()
(および他のプリミティブの同等のメソッド)が含まれています。 リリースノート から:
min
およびmax
の値で定義された閉じた範囲に特定の値を制約するconstrainToRange([type] value, [type] min, [type] max)
メソッドを追加しました。範囲内にある場合は値自体を返し、範囲より下の場合はmin
を返し、範囲より上にある場合はmax
を返します。
https://stackoverflow.com/a/42968254/122441 から@ dimo414によってコピーされました。
残念ながら、このバージョンは2017年7月の時点でごく最近のものであり、一部のプロジェクトでは( https://stackoverflow.com/a/40691831/122441 を参照)今のところ19。また、Commons LangもCommons Mathも持っていないことにショックを受けました! :(
OPは標準ライブラリでこの実装を要求します:
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);
}
残念なことに、標準の数学ライブラリにはこれらが欠けています
Androidを使用している場合は、MathUtils(サポートライブラリ内)を使用します。これには、クランプと呼ばれるこれを具体的に行う関数が1つしかありません。
このメソッドは数値を受け取り、指定された数値範囲に収まるようにします。数値が範囲に必要な最小値より小さい場合、範囲の最小値が返されます。数値が範囲で許可されている最大値よりも大きい場合、範囲の最大値が返されます。
Math.max(int a, int b)
関数は次のように定義されます:
public static int min(int a, int b) {
return (a <= b) ? a : b;
}
したがって、次のようにmax
関数とmin
関数の組み合わせを作成できます。
private static int MAX=10;
private static int MIN=0;
public int limit(int a) {
return (a > MAX) ? MAX : (a < MIN ? MIN: a );
}
Comparable
(Number
およびそのサブクラスを含む)を実装するクラスの汎用メソッド:
_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;
}
_
唯一の要件は、すべての引数が同じクラスでなければならないであることです。型変換の損失を防ぎます。実際、float
とdouble
のlong
をint
などと比較するのは正しくありません。たとえば、_(double) 0.1 != (float) 0.1
_。
使用法:
_double x = 13.000000001;
x = limit(x, 12.0, 13.0);
System.out.println("x = " + x); //x = 13.0
_
残念ながら、プリミティブ型は不変であるため、limit(x, 12.0, 13.0)
だけで最初の引数を直接変更することはできません。
これがJavaに求められたことを理解しています。 Android world、KotlinとJavaを組み合わせて使用するのが一般的です。一部のKotlinユーザーがここに到達した場合(私のように)、その後coerceIn
拡張を使用できます関数:
コトリンコード:
println(10.coerceIn(1, 100)) // 10
println(10.coerceIn(1..100)) // 10
println(0.coerceIn(1, 100)) // 1
println(500.coerceIn(1, 100)) // 100
詳細については、公式の Kotlin Documentation をご覧ください。